Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

python — Как ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΡΠ΅Ρ‡ΡŒ врСмя выполнСния ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ суммарноС врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΡ‚ΡŒ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΌΠΎΠΆΠ½ΠΎ time ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ (часто встроСна Π² shell):

$ time python -c 'import time; time.sleep(1)'
python -c 'import time; time.sleep(1)'  0.01s user 0.00s system 1% cpu 1.021 total

Если ΠΊΠΎΠΌΠ°Π½Π΄Π° нСдоступна, Π΅Ρ‘ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠŸΠΈΡ‚ΠΎΠ½Π΅.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ сколько Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚, ΠΌΠΎΠΆΠ½ΠΎ cProfile ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ:

$ python -m cProfile -s time your_module.py

Π’ графичСском Π²ΠΈΠ΄Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΡƒΠ΄ΠΎΠ±Π½ΠΎ Π² KCachegrind ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠΌΠ°Π½Π΄. Π‘ΠΎΠ»ΡŒΡˆΠ΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ²: How can you profile a script?

line_profiler позволяСт построчно сравнСниС ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ.

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅:

  • timeit
  • reporttime.py
  • make-figures.py
  • reporttime + pandas

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΌΠΎΠΆΠ½ΠΎ timeit ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ:

$ python -m timeit -s 'from insertion_sort import sorted; L = list(range(10**5))' 'sorted(L)'

Π’ΠΎΡ‚ ΠΆΠ΅ интСрфСйс прСдоставляСт pyperf ΠΌΠΎΠ΄ΡƒΠ»ΡŒ (ΠΏΠΎΠΌΠΈΠΌΠΎ ΠΏΡ€ΠΎΡ‡Π΅Π³ΠΎ):

$ python -m pyperf timeit -s '. ..' 'sorted(L)'

ДокумСнтация ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ pyperf Π±ΠΎΠ»Π΅Π΅ Π½Π°Π΄Ρ‘ΠΆΠ½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π²Ρ‹Π΄Π°Ρ‘Ρ‚.

Для ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ %timeit magic Π² ipython/jupyter notebook ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ.

ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΡ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, стоит ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ (тСсты), Ρ‡Ρ‚ΠΎ измСнСния Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ускорили Π΅Ρ‘ Ρ€Π°Π±ΠΎΡ‚Ρƒ (сравнСниС ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ). Для этого ΠΌΠΎΠΆΠ½ΠΎ pytest-benchmarkΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ.

Для удобства сравнСния ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ², ΠΌΠΎΠΆΠ½ΠΎ автоматичСски ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΏΠΎ ΠΎΠ±Ρ‰Π΅ΠΌΡƒ прСфиксу Π² ΠΈΠΌΠ΅Π½ΠΈ (

get_functions_with_prefix()). К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Ссли Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² вопросС ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π·Π²Π°Ρ‚ΡŒ: sorted_selection, sorted_insertion, sorted_bubble ΠΈ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² daedra.py Ρ„Π°ΠΉΠ»:

#!/usr/bin/env python
import random
from reporttime import get_functions_with_prefix, measure
import daedra
funcs = get_functions_with_prefix('sorted_', module=daedra)
for comment, L in [
        ("all same", [1] * 10**3),
        ("range", list(range(10**3))),
        ("random", list(range(10**3)))]:
    if comment == "random":
        random.
shuffle(L) measure(funcs, args=[L], comment=comment)

Π³Π΄Π΅ reporttime.py. measure() функция измСряСт ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΠΎΡ…ΠΎΠΆΠΈΠΌ Π½Π° python -mtimeit ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ способом.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹

name                  time  ratio comment
sorted_insertion  184 usec   1.00 all same
sorted_selection 55.9 msec 303.86 all same
sorted_bubble    59.4 msec 322.92 all same
name                  time  ratio comment
sorted_insertion  186 usec   1.00 range
sorted_selection 57.7 msec 309.44 range
sorted_bubble    60.8 msec 326.40 range
name                  time ratio comment
sorted_selection   58 msec  1.00 random
sorted_insertion 66.2 msec  1.14 random
sorted_bubble     119 msec  2.05 random

Π’Π°Π±Π»ΠΈΡ†Π° ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½Π° ΡƒΠΆΠ΅ отсортированном Π²Π²ΠΎΠ΄Π΅ sorted_insertion() функция Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Π²Π°Π΅Ρ‚ (Π² этом случаС Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ врСмя для этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ трСбуСтся ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΈΡ‡Π½Ρ‹ΠΌ для sorted_selection() ΠΈ sorted_bubble()). Для случайного Π²Π²ΠΎΠ΄Π°, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ одинаковая. sorted_bubble() Ρ…ΡƒΠΆΠ΅ Π²ΠΎ всСх Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°Ρ….

Π’ качСствС Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠ°ΠΊ @to_compare, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для сравнСния ΠΈ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… для

make-figures.py скрипта, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ измСряСт ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈ строит Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€.

Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ врСмя выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для Ρ€Π°Π·Π½Ρ‹Ρ… Π²Π²ΠΎΠ΄ΠΎΠ²:

#!/usr/bin/env python
#file: plot_daedra.py
import random
def seq_range(n):
    return list(range(n))
def seq_random(n):
    L = seq_range(n)
    random.shuffle(L)
    return L
if __name__ == '__main__':
    import sys
    from subprocess import check_call
    import daedra
    from reporttime import get_functions_with_prefix
    # measure performance and plot it
    check_call(["make-figures.py"] + [
        "--sort-function=daedra." + f.__name__
        for f in get_functions_with_prefix('sorted_', module=daedra)
    ] + [
        "--sequence-creator=plot_daedra.
" + f.__name__ for f in get_functions_with_prefix('seq_') ] + sys.argv[1:])

seq_range(), seq_random() Π·Π°Π΄Π°ΡŽΡ‚ Π΄Π²Π° Ρ‚ΠΈΠΏΠ° Π²Π²ΠΎΠ΄Π° (ΡƒΠΆΠ΅ отсортированный ΠΈ случайный соотвСтствСнно). МоТно ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ² seq_*(n) Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ запуска:

$ PYTHONPATH=. python plot_daedra.py --maxn 1024

PYTHONPATH=. ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ make-figures.py смог Π½Π°ΠΉΡ‚ΠΈ plot_daedra ΠΌΠΎΠ΄ΡƒΠ»ΡŒ (с seq_range, seq_random функциями) Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ.

--maxn опрСдСляСт наибольшСС n, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π² seq_(n) Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ пСрСдаётся.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹

Рисунки ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ sorted_insertion() ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π½Π° отсортированном Π²Π²ΠΎΠ΄Π΅ (seq_range=0,1,2,3,4,…,n-1). И ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΈΡ‡Π½ΠΎΠ΅ Π½Π° случайном Π²Π²ΠΎΠ΄Π΅ (seq_random). ΠšΠΎΡΡ„Ρ„ΠΈΡ†ΠΈΠ΅Π½Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄ log2(N) ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠ±Π»ΠΈΠΆΡ‘Π½Π½ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ роста Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π² зависимости ΠΎΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π²Π²ΠΎΠ΄Π°:

|------------------------------+-------------------|
| Fitting polynom              | Function          |
|------------------------------+-------------------|
| 1.
00 log2(N) + 1.25e-015 | N | | 2.00 log2(N) + 5.31e-018 | N*N | | 1.19 log2(N) + 1.116 | N*log2(N) | | 1.37 log2(N) + 2.232 | N*log2(N)*log2(N) |

Π‘ΠΎΠ±Ρ€Π°Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠΉ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ сортировки ΠΈΠ· daedra.py (sorted_*()) для Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² (ΡƒΠΆΠ΅ отсортированный/случайный) ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² Π²Π²ΠΎΠ΄Π° (Π΄Π»ΠΈΠ½Ρ‹ ΠΎΡ‚ 1 Π΄ΠΎ 100000):

import random
import daedra
from reporttime import get_functions_with_prefix, measure_func
times = {}  # (function name, input type, exp size) -> time it takes
for f in get_functions_with_prefix('sorted_', module=daedra):
    for N in range(6):
        for case, L in [
            ("range", list(range(10**N))),
            ("random", list(range(10**N)))]:
            if case == "random":
               random.shuffle(L)
            times[(f.__name__, case, N)] = measure_func(f, [L])

Π£Π΄ΠΎΠ±Π½ΠΎ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ pandas.DataFrame:

import pandas as pd
df = pd. DataFrame([dict(function=f, input=i, size=10**n, time=t)
                   for (f,i,n), t in times.items()])

К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π½Π° ΡƒΠΆΠ΅ отсортированном Π²Π²ΠΎΠ΄Π΅:

def plot_input(input):
    p = df[df.input==input].pivot(index='function', columns='size', values='time')
    p.T.plot(loglog=True,, title=input)  # same style as in @MaxU's answer
    return p
plot_input('range')

ПовСдСниС Π½Π° случайном Π²Π²ΠΎΠ΄Π΅:

plot_input('random')

Или ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π²Π²ΠΎΠ΄Π° Π½Π° ΠΎΠ΄Π½ΠΎΠΌ Π³Ρ€Π°Ρ„ΠΈΠΊΠ΅:

p = df[df.function=='sorted_insertion'].pivot(index='input', columns='size', values='time')
p.T.plot(loglog=True,, title='sorted_insertion')

ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ jupyter notebook.

Π˜Π·ΠΌΠ΅Ρ€ΡŒΡ‚Π΅ ΠΏΡ€ΠΎΡˆΠ΅Π΄ΡˆΠ΅Π΅ врСмя Π² Python

Π’ этом постС ΠΌΡ‹ обсудим, ΠΊΠ°ΠΊ ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΡˆΠ΅Π΄ΡˆΠ΅Π΅ врСмя Π² Python.

1. ИспользованиС

timeit ΠΌΠΎΠ΄ΡƒΠ»ΡŒ

Python timeit ΠœΠΎΠ΄ΡƒΠ»ΡŒ ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для измСрСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΊΠΎΠ΄Π°.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ timeit() функция, которая выполняСт Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ с number исполнСний, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ€Π°Π²Π½ΠΎ 1 ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Ρƒ. Он Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ сборку мусора Π½Π° врСмя.

1

2

3

4

5

6

7

8

import timeit

import time

Β 

if __name__ == ‘__main__’:

Β 

Β Β Β Β t = timeit.timeit(lambda: time.sleep(1), number=5)

Β Β Β Β print(t)

Β 

Β 
The timeit ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Π΅Ρ‰Π΅ ΠΎΠ΄Π½Ρƒ ΡƒΠ΄ΠΎΠ±Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, repeat(), которая выполняСт Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ repeat ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈ number ΠΊΠ°Π·Π½ΠΈ.

1

2

3

4

5

6

7

8

import timeit

import time

Β 

if __name__ == ‘__main__’:

Β 

Β Β Β Β t = timeit. repeat(lambda: time.sleep(1), repeat=10, number=5)

Β Β Β Β print(t)

Β 

Β 
НаконСц, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ timeit.default_timer().

1

2

3

4

5

6

7

8

9

10

11

import timeit

import time

Β 

if __name__ == ‘__main__’:

Β 

Β Β Β Β start = timeit.default_timer()

Β Β Β Β time.sleep(1)

Β Β Β Β end = timeit.default_timer()

Β 

Β Β Β Β print(f»Time taken is {end — start}s»)

Β 

Π‘ΠΊΠ°Ρ‡Π°Ρ‚ΡŒΒ Β Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄

2. ИспользованиС

time ΠΌΠΎΠ΄ΡƒΠ»ΡŒ

Начиная с Python 3.3, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ time.perf_counter() функция для получСния значСния счСтчика ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ для измСрСния ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠΉ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ часы с самым высоким доступным Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ. Π’Π°ΠΉΠΌΠ΅Ρ€ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ модуля timeit default_timer() всСгда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ time.perf_counter().

1

2

3

4

5

6

7

8

9

10

import time

Β 

if __name__ == ‘__main__’:

Β 

Β Β Β Β start = time.perf_counter()

Β Β Β Β time.sleep(1)

Β Β Β Β end = time.perf_counter()

Β 

Β Β Β Β print(f»Time taken is {end — start}»)

Β 

Π‘ΠΊΠ°Ρ‡Π°Ρ‚ΡŒΒ Β Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄

Β 
Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΡ‚ΡŒ врСмя, ΠΏΡ€ΠΎΡˆΠ΅Π΄ΡˆΠ΅Π΅ ΠΌΠ΅ΠΆΠ΄Ρƒ двумя экзСмплярами ΠΊΠΎΠ΄Π° Π² наносСкундах, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ time.time_ns() функция, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ врСмя Π² наносСкундах с Π½Π°Ρ‡Π°Π»Π° эпохи Π² Π²ΠΈΠ΄Π΅ числа с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой.

1

2

3

4

5

6

7

8

9

10

import time

Β 

if __name__ == ‘__main__’:

Β 

Β Β Β Β start = time. time_ns()

Β Β Β Β time.sleep(1)

Β Β Β Β end = time.time_ns()

Β 

Β Β Β Β print(f»Time taken is {end — start}ns»)

Β 

Π‘ΠΊΠ°Ρ‡Π°Ρ‚ΡŒΒ Β Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄

3. ИспользованиС

datetime ΠΌΠΎΠ΄ΡƒΠ»ΡŒ

Если Π²Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½Π° высокая Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π°ΡΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ врСмя, ΠΏΡ€ΠΎΡˆΠ΅Π΄ΡˆΠ΅Π΅ ΠΌΠ΅ΠΆΠ΄Ρƒ двумя экзСмплярами ΠΊΠΎΠ΄Π°, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ datetime.now() Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅:

1

2

3

4

5

6

7

8

9

10

11

from datetime import datetime

import time

Β 

if __name__ == ‘__main__’:

Β 

Β Β Β Β start = datetime.now()

Β Β Β Β time.sleep(1)

Β Β Β Β end = datetime.now()

Β 

Β Β Β Β print(f»Time taken in (hh:mm:ss.ms) is {end — start}»)

Β 

Π‘ΠΊΠ°Ρ‡Π°Ρ‚ΡŒΒ Β Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄

Π­Ρ‚ΠΎ всС, Ρ‡Ρ‚ΠΎ касаСтся измСрСния ΠΏΡ€ΠΎΡˆΠ΅Π΄ΡˆΠ΅Π³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² Python.

ΠžΡ†Π΅Π½ΠΈΡ‚ΡŒ этот пост

Π‘Ρ€Π΅Π΄Π½ΠΈΠΉ Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ 5/5. ΠŸΠΎΠ΄ΡΡ‡Π΅Ρ‚ голосов: 21

Голосов ΠΏΠΎΠΊΠ° Π½Π΅Ρ‚! Π‘ΡƒΠ΄ΡŒΡ‚Π΅ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ, ΠΊΡ‚ΠΎ ΠΎΡ†Π΅Π½ΠΈΡ‚ этот пост.

Π‘ΠΎΠΆΠ°Π»Π΅Π΅ΠΌ, Ρ‡Ρ‚ΠΎ этот пост Π½Π΅ оказался для вас ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ!

РасскаТитС, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ этот пост?


Бпасибо Π·Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅.

ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ наш ΠΎΠ½Π»Π°ΠΉΠ½-компилятор Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ Π² коммСнтариях, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ C, C++, Java, Python, JavaScript, C#, PHP ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ популярныС языки программирования.

Как ΠΌΡ‹? ΠŸΠΎΡ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠΉΡ‚Π΅ нас своим Π΄Ρ€ΡƒΠ·ΡŒΡΠΌ ΠΈ ΠΏΠΎΠΌΠΎΠ³ΠΈΡ‚Π΅ Π½Π°ΠΌ расти. Π£Π΄Π°Ρ‡Π½ΠΎΠ³ΠΎ кодирования πŸ™‚


Python ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ [5 способов] β€” PYnative

ΠŸΡ€ΠΎΡ‡ΠΈΡ‚Π°Π² эту ΡΡ‚Π°Ρ‚ΡŒΡŽ, Π²Ρ‹ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅: β€”

  • Как Ρ€Π°ΡΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² Python
  • Π˜Π·ΠΌΠ΅Ρ€ΠΈΡ‚ΡŒ ΠΎΠ±Ρ‰Π΅Π΅ врСмя, Π·Π°Ρ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ΅ Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° Π±Π»ΠΎΠΊ Π² сСкундах, миллисСкундах, ΠΌΠΈΠ½ΡƒΡ‚Π°Ρ… ΠΈ ​​часах
  • Π’Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ врСмя выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ Ρ†ΠΈΠΊΠ»ΠΎΠ².

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠœΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ способа для измСрСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния Π² Python: –

  • time. time() функция: ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΡ‚ΡŒ ΠΎΠ±Ρ‰Π΅Π΅ врСмя, Π·Π°Ρ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ΅ Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ сцСнария Π² сСкундах.
  • time.process_time() : ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния ЦП ΠΊΠΎΠ΄Π°
  • ΠΌΠΎΠ΄ΡƒΠ»ΡŒ timeit : ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния нСбольшого Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠ΄Π°, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΎΠ΄Π½Ρƒ строку ΠΊΠΎΠ΄Π°, Π° Ρ‚Π°ΠΊΠΆΠ΅ code
  • ΠœΠΎΠ΄ΡƒΠ»ΡŒ DateTime : ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ часы-ΠΌΠΈΠ½ΡƒΡ‚Ρ‹-сСкунды.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠ΄Π°, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°ΡΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ врСмя, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ скрипту/ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ для выполнСния. Π˜Π·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈΠ»ΠΈ Π΅Π΅ частСй Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ вашСй ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы, вСрсии Python ΠΈ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚Π΅ ΠΏΠΎΠ΄ словом «врСмя».

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π΄Π²ΠΈΠ³Π°Ρ‚ΡŒΡΡ дальшС, сначала ΠΏΠΎΠΉΠΌΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ врСмя.

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

  • ВрСмя стСны Π² сравнСнии с Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ процСссора
  • Как ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΡ‚ΡŒ врСмя выполнСния Π² Python
    • ΠŸΡ€ΠΈΠΌΠ΅Ρ€: ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² сСкундах
    • ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния Π² миллисСкундах
    • ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния Π² ΠΌΠΈΠ½ΡƒΡ‚Π°Ρ…
  • ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния ЦП ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ process_time()
  • ΠœΠΎΠ΄ΡƒΠ»ΡŒ timeit для измСрСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния ΠΊΠΎΠ΄Π°
    • ΠŸΡ€ΠΈΠΌΠ΅Ρ€. Π˜Π·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
    • Π˜Π·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния ΠΎΠ΄Π½ΠΎΠΉ строки ΠΊΠΎΠ΄Π°
    • Π˜Π·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… строк ΠΊΠΎΠ΄Π°
  • ΠœΠΎΠ΄ΡƒΠ»ΡŒ DateTime для опрСдСлСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния сцСнария
  • Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

ВрСмя стСны ΠΈ врСмя процСссора

ΠœΡ‹ часто сталкиваСмся с двумя Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°ΠΌΠΈ для измСрСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния: врСмя настСнных часов ΠΈ врСмя процСссора.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π²Π°ΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π°Ρ‚ΡŒ эти Π΄Π²Π° Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°.

  • ВрСмя Π½Π° стСнС (Ρ‚Π°ΠΊΠΆΠ΅ извСстноС ΠΊΠ°ΠΊ врСмя ΠΏΠΎ часам ΠΈΠ»ΠΈ врСмя настСнных часов) β€” это просто ΠΎΠ±Ρ‰Π΅Π΅ врСмя, ΠΏΡ€ΠΎΡˆΠ΅Π΄ΡˆΠ΅Π΅ Π²ΠΎ врСмя измСрСния. Π­Ρ‚ΠΎ врСмя ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΡ‚ΡŒ сСкундомСром. Π­Ρ‚ΠΎ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ окончания выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ Π΅Π΅ запуска. Бюда Ρ‚Π°ΠΊΠΆΠ΅ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ врСмя оТидания рСсурсов .
  • ВрСмя ЦП, с Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, относится ΠΊ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ЦП Π±Ρ‹Π» занят ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ инструкций ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ВрСмя, ΠΏΠΎΡ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ΅ Π½Π° ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°), Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π²ΠΎ врСмя ЦП. НС Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ врСмя оТидания рСсурсов.

Π Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ стСны ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ЦП ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ связана с Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ΠΎΠΉ ΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒΡŽ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π·Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ°ΠΌΠΈ ΠΈΠ»ΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ΠΌ доступности систСмных рСсурсов.

НапримСр, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° сообщаСт, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° использовала «врСмя ЦП 0 ΠΌ 0,2 с, врСмя стСны 2 ΠΌ 4 с». Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π±Ρ‹Π»Π° Π°ΠΊΡ‚ΠΈΠ²Π½Π° Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ 2 ΠΌΠΈΠ½ΡƒΡ‚ ΠΈ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… сСкунд. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, процСссор ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π° ΠΏΠΎΡ‚Ρ€Π°Ρ‚ΠΈΠ» всСго 0,2 сСкунды Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ вычислСний для ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΆΠ΄Π°Π»Π° освобоТдСния Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… рСсурсов.

Π’ Π½Π°Ρ‡Π°Π»Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ я явно ΡƒΠΊΠ°Π·Π°Π», ΠΊΠ°ΠΊΠΎΠ΅ врСмя измСряСт ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ .

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π²Ρ‹ измСряСтС врСмя выполнСния вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π°ΡΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ врСмя стСны ΠΈΠ»ΠΈ процСссорноС врСмя.

Как ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΡ‚ΡŒ врСмя выполнСния Π² Python

ΠœΠΎΠ΄ΡƒΠ»ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Python прСдоставляСт Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, связанныС со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ приостановка выполнСния Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π½Π° Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ количСство сСкунд. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ шаги ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ для расчСта Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

  1. Π˜ΠΌΠΏΠΎΡ€Ρ‚ модуля Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ

    ΠœΠΎΠ΄ΡƒΠ»ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ поставляСтся со стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ Python. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ Π΅Π³ΠΎ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°.

  2. Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ врСмя Π½Π°Ρ‡Π°Π»Π°

    Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ врСмя Π½Π°Ρ‡Π°Π»Π° ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠ΅Ρ€Π²ΠΎΠΉ строки ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Для этого ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ time() , Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ врСмя ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Β« start_time Β» ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΠ΅Ρ€Π²ΠΎΠΉ строкой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.
    Ѐункция time() модуля Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для получСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² сСкундах с Π½Π°Ρ‡Π°Π»Π° эпохи. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° високосных сСкунд зависит ΠΎΡ‚ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹.

  3. Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ врСмя окончания

    Π”Π°Π»Π΅Π΅ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ врСмя окончания ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ послСднСй строки.
    ΠžΠΏΡΡ‚ΡŒ ΠΆΠ΅, ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ time() , Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ врСмя ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Β« end_time Β» ΠΏΠ΅Ρ€Π΅Π΄ послСднСй строкой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

  4. РасчСт Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния

    Π Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ окончания ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ Π½Π°Ρ‡Π°Π»Π° являСтся Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ выполнСния. ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ врСмя выполнСния, вычтя врСмя Π½Π°Ρ‡Π°Π»Π° ΠΈΠ· Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ окончания.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² сСкундах

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ это Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… случаях: –

  • ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния сцСнария
  • Π˜Π·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ строками ΠΊΠΎΠ΄Π°.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ : Π­Ρ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ измСряСт врСмя стСны, Ρ‚. Π΅. ΠΎΠ±Ρ‰Π΅Π΅ ΠΏΡ€ΠΎΡˆΠ΅Π΄ΡˆΠ΅Π΅ врСмя, Π° Π½Π΅ врСмя процСссора.

 врСмя ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°
# ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ врСмя Π½Π°Ρ‡Π°Π»Π°
ст = врСмя.врСмя()
# основная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°
# Π½Π°ΠΉΡ‚ΠΈ сумму Π΄ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π° чисСл
сумма_Ρ… = 0
для я в диапазонС (1000000):
    сумма_Ρ… += я
# ΠΆΠ΄Π΅ΠΌ 3 сСкунды
врСмя сна(3)
print('Π‘ΡƒΠΌΠΌΠ° ΠΏΠ΅Ρ€Π²Ρ‹Ρ… 1 ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π° чисСл Ρ€Π°Π²Π½Π°:', sum_x)
# ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ врСмя окончания
et = врСмя.врСмя()
# ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ врСмя выполнСния
ΠΏΡ€ΠΎΡˆΠ΅Π΄ΡˆΠ΅Π΅_врСмя = et - st
print('ВрСмя выполнСния:', elapsed_time, 'сСкунды') 

Π’Ρ‹Ρ…ΠΎΠ΄ :

 Π‘ΡƒΠΌΠΌΠ° ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π° чисСл: 499999500000
ВрСмя выполнСния: 3,125561475753784 сСкунды 

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ : Если ваш ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ занят Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ, Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Π½ΠΎ большС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Если Π±Ρ‹ ваш скрипт ΠΎΠΆΠΈΠ΄Π°Π» Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… рСсурсов, врСмя выполнСния ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ»ΠΎΡΡŒ Π±Ρ‹, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ врСмя оТидания Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ ΠΊ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌΡƒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ.

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния Π² миллисСкундах

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ врСмя выполнСния Π² сСкундах, Π·Π°Ρ‚Π΅ΠΌ ΡƒΠΌΠ½ΠΎΠΆΡŒΡ‚Π΅ Π΅Π³ΠΎ Π½Π° 1000, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² миллисСкундах.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ :

 # ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ врСмя выполнСния Π² миллисСкундах
Ρ€Π΅Π· = эт - ст
final_res = Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ * 1000
ΠŸΠ΅Ρ‡Π°Ρ‚ΡŒ («ВрСмя выполнСния:Β», Final_res, 'Milliseconds') 

Π’Ρ‹Ρ…ΠΎΠ΄ :

 Π‘ΡƒΠΌΠΌΠ° ΠΏΠ΅Ρ€Π²Ρ‹Ρ… 1 ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ΠΎΠ² Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ²: 499999500000 
ВрСмя исполнСния: 3125.988006591797 Milliseconds
414143333.5015. Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ врСмя выполнСния Π² сСкундах, Π·Π°Ρ‚Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅ Π΅Π³ΠΎ Π½Π° 60, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² ΠΌΠΈΠ½ΡƒΡ‚Π°Ρ….

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ :

 # ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ врСмя выполнСния Π² ΠΌΠΈΠ½ΡƒΡ‚Π°Ρ…
Ρ€Π΅Π· = эт - ст
final_res = Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ / 60
print('ВрСмя выполнСния:', final_res, 'ΠΌΠΈΠ½ΡƒΡ‚Ρ‹') 

Π’Ρ‹Π²ΠΎΠ΄ :

 Π‘ΡƒΠΌΠΌΠ° ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π° чисСл: 499999500000
ВрСмя выполнСния: 0. 052008008956 ΠΌΠΈΠ½ΡƒΡ‚ 

Π’Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π±ΠΎΠ»Π΅Π΅ качСствСнноС Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ?

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ strftime() для прСобразования Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² Π±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±ΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ (Ρ‡Ρ‡-ΠΌΠΌ-сс) часы-ΠΌΠΈΠ½ΡƒΡ‚Ρ‹-сСкунды.

 врСмя ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°
ст = врСмя.врСмя()
# ваш код
сумма_Ρ… = 0
для я в диапазонС (1000000):
    сумма_Ρ… += я
врСмя сна(3)
print('Π‘ΡƒΠΌΠΌΠ°:', sum_x)
ΠΏΡ€ΠΎΡˆΠ΅Π΄ΡˆΠ΅Π΅_врСмя = врСмя.врСмя() - ст
print('ВрСмя выполнСния:', time.strftime("%H:%M:%S", time.gmtime(elapsed_time)))
 

Π’Ρ‹Π²ΠΎΠ΄ :

 Π‘ΡƒΠΌΠΌΠ°: 499999500000 
ВрСмя выполнСния: 00:00:03

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ

process_time() 8 time 90.1 2time Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Ρ€ΡΡ‚ΡŒ врСмя настСнных часов 90.1119. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΡ‚ΡŒ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ процСссором, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ time.process_time() вмСсто time.time() .

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ это Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, Ссли Π²Ρ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ врСмя оТидания рСсурсов Π² ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим, ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ процСссором.

 врСмя ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°
# ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ врСмя Π½Π°Ρ‡Π°Π»Π°
ст = врСмя.процСсс_врСмя()
# основная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°
# Π½Π°ΠΉΡ‚ΠΈ сумму Π΄ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π° чисСл
сумма_Ρ… = 0
для я в диапазонС (1000000):
    сумма_Ρ… += я
# ΠΆΠ΄Π΅ΠΌ 3 сСкунды
врСмя сна(3)
print('Π‘ΡƒΠΌΠΌΠ° ΠΏΠ΅Ρ€Π²Ρ‹Ρ… 1 ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π° чисСл Ρ€Π°Π²Π½Π°:', sum_x)
# ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ врСмя окончания
et = врСмя.процСсс_врСмя()
# ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ врСмя выполнСния
Ρ€Π΅Π· = эт - ст
print('ВрСмя выполнСния ЦП:', res, 'сСкунды') 

Π’Ρ‹Π²ΠΎΠ΄ :

 Π‘ΡƒΠΌΠΌΠ° ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π° чисСл: 499999500000
ВрСмя выполнСния процСссора: 0,234375 сСкунд 

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ :

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ рассчитываСм врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ процСссором, ΠΊΠ°ΠΊ Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π±Ρ‹Π»Π° Π°ΠΊΡ‚ΠΈΠ²Π½Π° Π±ΠΎΠ»Π΅Π΅ 3 сСкунд. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, эти 3 сСкунды Π½Π΅ Π±Ρ‹Π»ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ ΠΊ процСссорному Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ процСссор Π±Ρ‹Π» ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΌ, Π° процСссор ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π° ΠΏΠΎΡ‚Ρ€Π°Ρ‚ΠΈΠ» всСго 0,23 сСкунды Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ вычислСний для ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

ΠœΠΎΠ΄ΡƒΠ»ΡŒ timeit для измСрСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния ΠΊΠΎΠ΄Π°

ΠœΠΎΠ΄ΡƒΠ»ΡŒ Python timeit обСспСчиваСт простой способ измСрСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ нСбольшого Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠ΄Π° Python. Он ΠΈΠΌΠ΅Π΅Ρ‚ ΠΊΠ°ΠΊ интСрфСйс ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, Ρ‚Π°ΠΊ ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ. Π­Ρ‚ΠΎ позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΈΡ… распространСнных Π»ΠΎΠ²ΡƒΡˆΠ΅ΠΊ для измСрСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния.

ΠœΠΎΠ΄ΡƒΠ»ΡŒ timeit ΠΏΠΎΠ»Π΅Π·Π΅Π½ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… случаях: –

  • ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния нСбольшого Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠ΄Π°, Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Ρ†ΠΈΠΊΠ»Ρ‹
  • Π˜Π·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ строками ΠΊΠΎΠ΄Π°.

Ѐункция timeit() : –

Ѐункция timeit.timeit() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ врСмя (Π² сСкундах), ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ для выполнСния ΠΊΠΎΠ΄Π° число Ρ€Π°Π·.

 timeit.timeit(stmt='pass', setup='pass', timer=<Ρ‚Π°ΠΉΠΌΠ΅Ρ€ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ>, number=1000000, globals=None) 

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ : это Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ измСряСт врСмя стСны, Ρ‚. Π΅. ΠΎΠ±Ρ‰Π΅Π΅ ΠΏΡ€ΠΎΡˆΠ΅Π΄ΡˆΠ΅Π΅ врСмя, Π° Π½Π΅ процСссорноС врСмя.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ шаги ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚, ΠΊΠ°ΠΊ ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΡ‚ΡŒ врСмя выполнСния ΠΊΠΎΠ΄Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ модуля timeit.

  • Π‘Π½Π°Ρ‡Π°Π»Π° создайтС экзСмпляр Timer с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ timeit()
  • Π—Π°Ρ‚Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°ΠΉΡ‚Π΅ ΠΊΠΎΠ΄ вмСсто Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° stmt . stmt β€” это ΠΊΠΎΠ΄, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΡ‚ΡŒ врСмя.
  • Π”Π°Π»Π΅Π΅, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ нСсколько ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΏΠ΅Ρ€Π΅Π΄ вашим фактичСским ΠΊΠΎΠ΄ΠΎΠΌ, ΠΏΠ΅Ρ€Π΅Π΄Π°ΠΉΡ‚Π΅ ΠΈΡ… Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ настройки, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°.
  • Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°, ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, прСдоставлСнный Python.
  • Π—Π°Ρ‚Π΅ΠΌ Ρ€Π΅ΡˆΠΈΡ‚Π΅, сколько Ρ€Π°Π· Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄, ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°ΠΉΡ‚Π΅ Π΅Π³ΠΎ числовому Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρƒ. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ числа ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ β€” 1Β 000Β 000.
  • Π’ ΠΊΠΎΠ½Ρ†Π΅ ΠΌΡ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ timeit() с Π²Ρ‹ΡˆΠ΅ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌΠΈ значСниями для измСрСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния ΠΊΠΎΠ΄Π°

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: Π˜Π·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ рассчитаСм врСмя выполнСния функция Β«Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅()Β». ΠœΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ add() Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΏΡΡ‚ΡŒ Ρ€Π°Π·, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ срСднСС врСмя выполнСния.

 врСмя ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°
# Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ слоТСниС ΠΏΠ΅Ρ€Π²Ρ‹Ρ… 1 ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π° чисСл
Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π·Π°Ρ‰ΠΈΡ‚Ρ‹():
    print('Π”ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅:', сумма(Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½(1000000)))
# Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΊΠΎΠ΄ 5 Ρ€Π°Π·, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΠΌΡ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅
ΠΏ = 5
# Ρ€Π°ΡΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ±Ρ‰Π΅Π΅ врСмя выполнСния
Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ = timeit. timeit(stmt='Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅()', globals=globals(), число=n)
# Ρ€Π°ΡΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ врСмя выполнСния
# ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ срСднСС врСмя выполнСния
print(f"ВрСмя выполнСния {result / n} сСкунд") 

Π’Ρ‹Π²ΠΎΠ΄ :

 Π”ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅: 499999500000
Π”ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅: 499999500000
Π”ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅: 499999500000
Π”ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅: 499999500000
Π”ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅: 499999500000
ВрСмя выполнСния составляСт 0,03770382 сСкунды 

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ :

Если Π²Ρ‹ запускаСтС Ρ‚Ρ€ΡƒΠ΄ΠΎΠ΅ΠΌΠΊΠΈΠΉ ΠΊΠΎΠ΄ со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½ΠΎΠΌΠ΅Ρ€ , это Π·Π°ΠΉΠΌΠ΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ присвойтС мСньшСС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρƒ число ΠΈΠ»ΠΈ Ρ€Π΅ΡˆΠΈΡ‚Π΅, сколько Π²Ρ‹Π±ΠΎΡ€ΠΎΠΊ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ врСмя выполнСния ΠΊΠΎΠ΄Π°.

  • Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ timeit() ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ сборщик мусора, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Ρ‚ΠΎΡ‡Π½ΠΎΠΌΡƒ Π·Π°Ρ…Π²Π°Ρ‚Ρƒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.
  • Π’Π°ΠΊΠΆΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ timeit() ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ ΠΊΠΎΠ΄Π° ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π·, сколько Π·Π°Ρ…ΠΎΡ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ влияниС Π΄Ρ€ΡƒΠ³ΠΈΡ… Π·Π°Π΄Π°Ρ‡, Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Ρ… Π² вашСй ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмС. Благодаря этому ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ срСднСС врСмя выполнСния.

Π˜Π·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния ΠΎΠ΄Π½ΠΎΠΉ строки ΠΊΠΎΠ΄Π°

ЗапуститС ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ %timeit Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС ΠΈΠ»ΠΈ Π½Π° Π½ΠΎΡƒΡ‚Π±ΡƒΠΊΠ΅ Jupyter, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ врСмя выполнСния ΠΎΠ΄Π½ΠΎΠΉ строки ΠΊΠΎΠ΄Π°.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ : Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ %timeit нСпосрСдствСнно ΠΏΠ΅Ρ€Π΅Π΄ строкой ΠΊΠΎΠ΄Π°

 %timeit [x вмСсто x Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ (1000)]
# Π’Ρ‹Ρ…ΠΎΠ΄
2,08 мкс Β± 223 нс Π½Π° Ρ†ΠΈΠΊΠ» (срСднСС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Β± стандартноС ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠ΅ для 7 запусков, 1000000 Ρ†ΠΈΠΊΠ»ΠΎΠ² Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ) 

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ для ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ профилирования ΠΈ получСния Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния.

  • ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ количСство ΠΏΡ€ΠΎΠ³ΠΎΠ½ΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° -r . НапримСр, %timeit -r10 your_code ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ запуск строки ΠΊΠΎΠ΄Π° 10 Ρ€Π°Π·.
  • ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ Ρ†ΠΈΠΊΠ»Ρ‹ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Ρ†ΠΈΠΊΠ»Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² -r ΠΈ -n .
  • Если Π²Ρ‹ опуститС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, это Π±ΡƒΠ΄Π΅Ρ‚ 7 ΠΏΡ€ΠΎΠ³ΠΎΠ½ΠΎΠ² с 1 ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ΠΎΠΌ Ρ†ΠΈΠΊΠ»ΠΎΠ² Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΡ€ΠΎΠ³ΠΎΠ½Π΅

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: НастройтС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ профиля Π½Π° 10 ΠΏΡ€ΠΎΠ³ΠΎΠ½ΠΎΠ² ΠΈ 20 Ρ†ΠΈΠΊΠ»ΠΎΠ² Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΡ€ΠΎΠ³ΠΎΠ½Π΅.

 # Настройка количСства ΠΏΡ€ΠΎΠ³ΠΎΠ½ΠΎΠ² ΠΈ Ρ†ΠΈΠΊΠ»ΠΎΠ² Π² %timeit
%timeit -r10 -n20 [x для x в диапазонС (1000)]
# Π²Ρ‹Ρ…ΠΎΠ΄
1,4 мкс Β± 12,34 нс Π½Π° ΠΏΠ΅Ρ‚Π»ΡŽ (срСднСС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Β± стандартноС ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠ΅ для 10 Ρ†ΠΈΠΊΠ»ΠΎΠ², ΠΏΠΎ 20 Ρ†ΠΈΠΊΠ»ΠΎΠ² Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ) 

Π˜Π·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… строк ΠΊΠΎΠ΄Π°

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ %%timeit , ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΡ‚ΡŒ врСмя выполнСния Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… строк ΠΊΠΎΠ΄Π°. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ останутся ΠΏΡ€Π΅ΠΆΠ½ΠΈΠΌΠΈ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ : Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ ( % ) Π½Π° Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ ( %% ) Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅ timeit, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ врСмя выполнСния Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… строк ΠΊΠΎΠ΄Π°

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ :

 # ΠŸΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ %%timeit
%%timeit -r5 -n10
# Π½Π°ΠΉΡ‚ΠΈ сумму Π΄ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π° чисСл
сумма_Ρ… = 0
для я в диапазонС (1000000):
    сумма_Ρ… += я
# Π’Ρ‹Ρ…ΠΎΠ΄
10,5 мкс Β± 226 нс Π½Π° ΠΏΠ΅Ρ‚Π»ΡŽ (срСднСС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Β± стандартноС ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠ΅ для 5 Ρ†ΠΈΠΊΠ»ΠΎΠ², ΠΏΠΎ 10 Ρ†ΠΈΠΊΠ»ΠΎΠ² Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ) 

ΠœΠΎΠ΄ΡƒΠ»ΡŒ DateTime для опрСдСлСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния скрипта

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Datetime для измСрСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ шаги.
Π˜ΠΌΠΏΠΎΡ€Ρ‚ модуля DateTime

  • Π—Π°Ρ‚Π΅ΠΌ сохранитС врСмя Π½Π°Ρ‡Π°Π»Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ datetime.now() ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΠ΅Ρ€Π²ΠΎΠΉ строкой сцСнария
  • Π—Π°Ρ‚Π΅ΠΌ сохранитС врСмя окончания ΠΏΠ΅Ρ€Π΅Π΄ использованиСм Ρ‚ΠΎΠΉ ΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅Π΄ послСднСй строкой сцСнария
  • Π’ ΠΊΠΎΠ½Ρ†Π΅ рассчитайтС врСмя выполнСния, вычитая врСмя Π½Π°Ρ‡Π°Π»Π° ΠΈΠ· Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ окончания

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ : это Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ измСряСт врСмя стСны, Ρ‚. Π΅. ΠΎΠ±Ρ‰Π΅Π΅ ΠΏΡ€ΠΎΡˆΠ΅Π΄ΡˆΠ΅Π΅ врСмя, Π° Π½Π΅ процСссорноС врСмя.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ :

 ΠΈΠΌΠΏΠΎΡ€Ρ‚ Π΄Π°Ρ‚Ρ‹ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ
врСмя ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°
# ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ Π΄Π°Ρ‚Ρƒ ΠΈ врСмя
ΡƒΠ» = datetime.datetime.now ()
# основная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°
# Π½Π°ΠΉΡ‚ΠΈ сумму Π΄ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π° чисСл
сумма_Ρ… = 0
для я в диапазонС (1000000):
    сумма_Ρ… += я
# ΠΆΠ΄Π΅ΠΌ 3 сСкунды
врСмя сна(3)
print('Π‘ΡƒΠΌΠΌΠ° ΠΏΠ΅Ρ€Π²Ρ‹Ρ… 1 ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π° чисСл Ρ€Π°Π²Π½Π°:', sum_x)
# ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Π΅Ρ‡Π½ΡƒΡŽ Π΄Π°Ρ‚Ρƒ ΠΈ врСмя
et = datetime.datetime.now()
# ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ врСмя выполнСния
ΠΏΡ€ΠΎΡˆΠ΅Π΄ΡˆΠ΅Π΅_врСмя = et - st
print('ВрСмя выполнСния:', elapsed_time, 'сСкунды') 

Π’Ρ‹Ρ…ΠΎΠ΄ :

 Π‘ΡƒΠΌΠΌΠ° ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π° чисСл: 499999500000
ВрСмя выполнСния: 0:00:03. 115498 сСкунд 

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Python прСдоставляСт нСсколько Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для получСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния ΠΊΠΎΠ΄Π°. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΡ‹ ΡƒΠ·Π½Π°Π»ΠΈ Ρ€Π°Π·Π½ΠΈΡ†Ρƒ ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ настСнных часов ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ процСссора, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠ΅ врСмя выполнСния Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΡ‚ΡŒ.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для измСрСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² Python:

  • time.time() : ΠΈΠ·ΠΌΠ΅Ρ€ΡŒΡ‚Π΅ ΠΎΠ±Ρ‰Π΅Π΅ врСмя, Π·Π°Ρ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ΅ Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° Π² сСкундах.
  • timeit.timeit() : ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ способ Π·Π°ΠΌΠ΅Ρ€ΠΈΡ‚ΡŒ врСмя нСбольшого Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠ΄Π° Python
  • %timeit ΠΈ %%timeit : ΠΊΠΎΠΌΠ°Π½Π΄Π° для получСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния ΠΎΠ΄Π½ΠΎΠΉ строки ΠΊΠΎΠ΄Π° ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… строк ΠΊΠΎΠ΄Π° .
  • datetime.datetime.now() : ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ врСмя выполнСния Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ часы-ΠΌΠΈΠ½ΡƒΡ‚Ρ‹-сСкунды

Π’Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ time.process_time() , Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ процСссором.

ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. Как ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΡˆΠ΅Π΄ΡˆΠ΅Π΅ врСмя Π² Python?

Π—Π°Π΄Π°Π²Π°Ρ‚ΡŒ вопрос

спросил

ИзмСнСно 2 дня назад

ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Π½ΠΎ 2,5 ΠΌΠ»Π½ Ρ€Π°Π·

Π― Ρ…ΠΎΡ‡Ρƒ ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΡ‚ΡŒ врСмя, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ для выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π― Π½Π΅ ΠΌΠΎΠ³ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ timeit Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ:

 врСмя ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°
Π½Π°Ρ‡Π°Π»ΠΎ = врСмя.врСмя()
Ρ€Π°ΡΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ("ΠΏΡ€ΠΈΠ²Π΅Ρ‚")
ΠΊΠΎΠ½Π΅Ρ† = врСмя.врСмя()
ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (ΠΊΠΎΠ½Π΅Ρ† - Π½Π°Ρ‡Π°Π»ΠΎ)
 
  • ΠΏΠΈΡ‚ΠΎΠ½
  • ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ
  • ΠΌΠ΅Ρ€Π°
  • врСмяит

3

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ time.time() для измСрСния ΠΏΡ€ΠΎΡˆΠ΅Π΄ΡˆΠ΅Π³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ настСнных часов ΠΌΠ΅ΠΆΠ΄Ρƒ двумя Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ:

 врСмя ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°
Π½Π°Ρ‡Π°Π»ΠΎ = врСмя.врСмя()
Ρ€Π°ΡΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ("ΠΏΡ€ΠΈΠ²Π΅Ρ‚")
ΠΊΠΎΠ½Π΅Ρ† = врСмя.врСмя()
ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (ΠΊΠΎΠ½Π΅Ρ† - Π½Π°Ρ‡Π°Π»ΠΎ)
 

ВрСмя выполнСния Π² сСкундах.


Π”Ρ€ΡƒΠ³ΠΈΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠΌ, начиная с Python 3.3, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использованиС perf_counter ΠΈΠ»ΠΈ process_time , Π² зависимости ΠΎΡ‚ Π²Π°ΡˆΠΈΡ… Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ. Π”ΠΎ вСрсии 3.3 Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π»ΠΎΡΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ time.clock (спасибо Amber). Однако Π² настоящСС врСмя ΠΎΠ½ устарСл:

Π’ Unix Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ врСмя процСссора Π² Π²ΠΈΠ΄Π΅ числа с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой выраТаСтся Π² сСкундах. Π’ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ, Π° Π½Π° самом Π΄Π΅Π»Π΅ само ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ значСния «процСссорного Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈΒ», зависит ΠΎΡ‚ значСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ C Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ ΠΈΠΌΠ΅Π½ΠΈ.

Π’ Windows эта функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ количСство сСкунд настСнных часов, ΠΏΡ€ΠΎΡˆΠ΅Π΄ΡˆΠΈΡ… с ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Π²ΠΈΠ΄Π΅ числа с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой Π½Π° основС Ѐункция Win32 QueryPerformanceCounter() . Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π»ΡƒΡ‡ΡˆΠ΅ ΠΎΠ΄Π½ΠΎΠΉ микросСкунды.

УстарСло, начиная с вСрсии 3.3 : ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ зависит Π½Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅: ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ perf_counter() ΠΈΠ»ΠΈ process_time() вмСсто , Π² зависимости ΠΎΡ‚ Π²Π°ΡˆΠΈΡ… Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‡Π΅Ρ‚ΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ timeit.default_timer вмСсто timeit.timeit . ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ автоматичСски прСдоставляСт Π»ΡƒΡ‡ΡˆΠΈΠ΅ часы, доступныС Π½Π° вашСй ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅ ΠΈ вСрсии Python:

 from timeit import default_timer as timer
старт = Ρ‚Π°ΠΉΠΌΠ΅Ρ€()
# ...
ΠΊΠΎΠ½Π΅Ρ† = Ρ‚Π°ΠΉΠΌΠ΅Ρ€()
print(end - start) # ВрСмя Π² сСкундах, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ 5. 38091952400282
 

timeit.default_timer назначаСтся для time.time() ΠΈΠ»ΠΈ time.clock() Π² зависимости ΠΎΡ‚ ОБ. Π’ Python 3.3+ default_timer β€” это time.perf_counter() Π½Π° всСх ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ…. Π‘ΠΌ. Python β€” time.clock () ΠΏΡ€ΠΎΡ‚ΠΈΠ² time.time () β€” Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ?

Π‘ΠΌ. Ρ‚Π°ΠΊΠΆΠ΅:

  • Код ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ
  • Как ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ

1

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ time.clock() устарСл, начиная с Python 3.3, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ time.perf_counter() для общСсистСмной синхронизации ΠΈΠ»ΠΈ time.process_time() для общСпроцСссной синхронизации, просто ΠΊΠ°ΠΊ Π²Ρ‹ использовали time.clock() :

 врСмя ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°
Ρ‚ = врСмя.процСсс_врСмя()
#сдСлай Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ
ΠΏΡ€ΠΎΡˆΠ΅Π΄ΡˆΠ΅Π΅_врСмя = врСмя.врСмя_процСсса() - t
 

Новая функция process_time Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ врСмя, ΠΏΡ€ΠΎΡˆΠ΅Π΄ΡˆΠ΅Π΅ Π²ΠΎ врСмя сна.

1

ВрСмя измСрСния Π² сСкундах:

 ΠΈΠ· timeit ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ default_timer ΠΊΠ°ΠΊ Ρ‚Π°ΠΉΠΌΠ΅Ρ€
ΠΈΠ· datetime ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ timedelta
старт = Ρ‚Π°ΠΉΠΌΠ΅Ρ€()
# . ...
# (здСсь Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ваш ΠΊΠΎΠ΄)
# ...
ΠΊΠΎΠ½Π΅Ρ† = Ρ‚Π°ΠΉΠΌΠ΅Ρ€()
ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (timedelta (сСкунды = ΠΊΠΎΠ½Π΅Ρ†-Π½Π°Ρ‡Π°Π»ΠΎ))
 

Π’Ρ‹Ρ…ΠΎΠ΄ :

 0:00:01.946339
 

0

Учитывая Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ,

test.py:

 def foo():
    # Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ "ΠΏΡ€ΠΈΠ²Π΅Ρ‚"
    Π²Π΅Ρ€Π½ΠΈ "ΠΏΡ€ΠΈΠ²Π΅Ρ‚"
 

Π‘Π°ΠΌΡ‹ΠΉ простой способ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ timeit β€” Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки:

 % python -mtimeit -s'import test' 'test.foo()'
1000000 Ρ†ΠΈΠΊΠ»ΠΎΠ², Π»ΡƒΡ‡ΡˆΠ΅Π΅ ΠΈΠ· 3: 0,254 мкс Π½Π° Ρ†ΠΈΠΊΠ»
 

НС ΠΏΡ‹Ρ‚Π°ΠΉΡ‚Π΅ΡΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ time.time ΠΈΠ»ΠΈ time.clock (Π½Π°ΠΈΠ²Π½ΠΎ) для сравнСния скорости Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Они ΠΌΠΎΠ³ΡƒΡ‚ Π΄Π°Ρ‚ΡŒ вводящиС Π² Π·Π°Π±Π»ΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹.

PS. НС ΠΏΠΎΠΌΠ΅Ρ‰Π°ΠΉΡ‚Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ; Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎΠ΅ врСмя Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ скорости Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°.

0

Π—Π°Π±Π°Π²Π½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ это с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° контСкста, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ автоматичСски Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ врСмя Π½Π°Ρ‡Π°Π»Π° ΠΏΡ€ΠΈ Π²Ρ…ΠΎΠ΄Π΅ Π² Π±Π»ΠΎΠΊ с , Π° Π·Π°Ρ‚Π΅ΠΌ фиксируСт врСмя окончания ΠΏΡ€ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΈΠ· Π±Π»ΠΎΠΊΠ°. Π‘ нСбольшими хитростями Π²Ρ‹ Π΄Π°ΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ подсчСт ΠΏΡ€ΠΎΡˆΠ΅Π΄ΡˆΠ΅Π³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π±Π»ΠΎΠΊΠ° ΠΈΠ· Ρ‚ΠΎΠΉ ΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° контСкста.

Π’ основной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ этого Π½Π΅Ρ‚ (Π½ΠΎ, вСроятно, Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ). Оказавшись Π½Π° мСстС, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ Π²Π΅Ρ‰ΠΈ, ΠΊΠ°ΠΊ:

 с elapsed_timer() ΠΊΠ°ΠΊ ΠΈΡΡ‚Π΅ΠΊΡˆΠ΅Π΅:
    # ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ Π΄Π»ΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄
    print("midpoint at %.2f сСкунды" % elapsed() ) # врСмя Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚
    # Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π΄Π»ΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄
print("всС сдСлано Π·Π° %.2f сСкунд" % истСкло() )
 

Π’ΠΎΡ‚ достаточный ΠΊΠΎΠ΄ contextmanager:

 from contextlib import contextmanager
ΠΈΠ· timeit ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ default_timer
@contextmanager
ΠΏΡ€ΠΎΡˆΠ΅Π΄ΡˆΠΈΠΉ_Ρ‚Π°ΠΉΠΌΠ΅Ρ€ Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ():
    запуск = Ρ‚Π°ΠΉΠΌΠ΅Ρ€_ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ()
    elapser = lambda: default_timer() β€” запуск
    Π²Ρ‹Ρ…ΠΎΠ΄ лямбда: eplapser()
    ΠΊΠΎΠ½Π΅Ρ† = Ρ‚Π°ΠΉΠΌΠ΅Ρ€_ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ()
    elapser = лямбда: ΠΊΠΎΠ½Π΅Ρ†-Π½Π°Ρ‡Π°Π»ΠΎ
 

И Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ исполняСмый дСмонстрационный ΠΊΠΎΠ΄:

 врСмя ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°
с elapsed_timer() ΠΊΠ°ΠΊ ΠΈΡΡ‚Π΅ΠΊΡˆΠΈΠΌ:
    врСмя сна(1)
    ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (ΠΈΡΡ‚Π΅ΠΊΡˆΠ΅Π΅())
    врСмя сна(2)
    ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (ΠΈΡΡ‚Π΅ΠΊΡˆΠ΅Π΅())
    врСмя сна(3)
 

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΠΎ замыслу этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ elapsed() замораТиваСтся ΠΏΡ€ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΈΠ· Π±Π»ΠΎΠΊΠ°, ΠΈ дальнСйшиС Π²Ρ‹Π·ΠΎΠ²Ρ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Ρ‚Ρƒ ΠΆΠ΅ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ (ΠΎΠΊΠΎΠ»ΠΎ 6 сСкунд Π² этом ΠΈΠ³Ρ€ΡƒΡˆΠ΅Ρ‡Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅).

2

Π― ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΡŽ это. врСмя doc слишком Π·Π°ΠΏΡƒΡ‚Π°Π½Π½Ρ‹ΠΉ.

 ΠΈΠ· Π΄Π°Ρ‚Ρ‹ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° Π΄Π°Ρ‚Ρ‹ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ
start_time = Π΄Π°Ρ‚Π° ΠΈ врСмя.сСйчас()
# ВБВАВЬВЕ Π‘Π’ΠžΠ™ ΠšΠžΠ”
time_elapsed = datetime.now() - start_time
print('ВрСмя истСкло (Ρ‡Ρ‡:ΠΌΠΌ:сс.мс) {}'.format(time_elapsed))
 

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ здСсь Π½Π΅ происходит Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ форматирования, я просто написал Ρ‡Ρ‡:ΠΌΠΌ:сс Π² распСчаткС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ time_elapsed

3

Π’ΠΎΡ‚ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ способ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это:

 >> ΠΈΠ· pytictoc ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ TicToc
>> t = TicToc() # ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ экзСмпляр TicToc
>> t.tic() # Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Ρ‚Π°ΠΉΠΌΠ΅Ρ€
>> # ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ
>> t.toc() # ВывСсти ΠΏΡ€ΠΎΡˆΠ΅Π΄ΡˆΠ΅Π΅ врСмя
ΠŸΡ€ΠΎΡˆΠ΅Π΄ΡˆΠ΅Π΅ врСмя составляСт 2,612231 сСкунды.
 

По ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΌ способом:

 >> со Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° со Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ
>> t1 = врСмя()
>> # ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ
>> t2 = врСмя()
>> ΠΏΡ€ΠΎΡˆΠ»ΠΎ = t2 - t1
>> print('ΠŸΡ€ΠΎΡˆΠ΅Π΄ΡˆΠ΅Π΅ врСмя: %f сСкунд. ' ΠŸΡ€ΠΎΡˆΠ»ΠΎ %)
ΠŸΡ€ΠΎΡˆΠ΅Π΄ΡˆΠ΅Π΅ врСмя составляСт 2,612231 сСкунды.
 

Установка:

 pip install pytictoc
 

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ свСдСния см. Π½Π° страницС PyPi.

5

Π‘Π°ΠΌΡ‹ΠΉ простой способ Ρ€Π°ΡΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ:

 врСмя ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°
start_time = врСмя.monotonic()
<ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹>
print('сСкунды:', time.monotonic() - start_time)
 

ΠžΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ докумСнтация здСсь.

2

Π’ΠΎΡ‚ ΠΌΠΎΠΈ Π²Ρ‹Π²ΠΎΠ΄Ρ‹ послС прочтСния ΠΌΠ½ΠΎΠ³ΠΈΡ… Ρ…ΠΎΡ€ΠΎΡˆΠΈΡ… ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² здСсь, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ… статСй.

Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Ссли Π²Ρ‹ ΠΊΠΎΠ»Π΅Π±Π»Π΅Ρ‚Π΅ΡΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ timeit ΠΈ time.time , timeit ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π²Π° прСимущСства:

  1. timeit Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ Π»ΡƒΡ‡ΡˆΠΈΠΉ Ρ‚Π°ΠΉΠΌΠ΅Ρ€, доступный для вашСй ОБ ΠΈ вСрсии Python.
  2. timeit ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ сборку мусора, ΠΎΠ΄Π½Π°ΠΊΠΎ это Π½Π΅ Ρ‚ΠΎ, Ρ‡Π΅Π³ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ…ΠΎΡ‚Π΅Ρ‚ΡŒ ΠΈΠ»ΠΈ Π½Π΅ Ρ…ΠΎΡ‚Π΅Ρ‚ΡŒ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ timeit Π½Π΅ Ρ‚Π°ΠΊ прост Π² использовании, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ, Π° ΠΊΠΎΠ³Π΄Π° Ρƒ вас Π΅ΡΡ‚ΡŒ ΠΊΡƒΡ‡Π° ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°, всС становится уТасно. Π’ ΠΈΠ΄Π΅Π°Π»Π΅ Π²Π°ΠΌ просто Π½ΡƒΠΆΠ΅Π½ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ с Π±Π»ΠΎΠΊΠΎΠΌ ΠΈ ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. К соТалСнию, для этого Π½Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ встроСнного, поэтому Ρƒ вас Π΅ΡΡ‚ΡŒ Π΄Π²Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°:

Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ 1: ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ timebudget

Timebudget β€” это ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Π°Ρ ΠΈ ΠΎΡ‡Π΅Π½ΡŒ простая Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ всСго Π² ΠΎΠ΄Π½ΠΎΠΉ строкС ΠΊΠΎΠ΄Π° послС pip. ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ.

 @timebudget # Π—Π°ΠΏΠΈΡˆΠΈΡ‚Π΅, сколько Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ эта функция
ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΌΠΎΠΉ_ΠΌΠ΅Ρ‚ΠΎΠ΄():
    # ΠΌΠΎΠΉ ΠΊΠΎΠ΄
 

Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ 2: Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΌΠΎΠΉ нСбольшой ΠΌΠΎΠ΄ΡƒΠ»ΡŒ

НиТС я создал нСбольшой слуТСбный ΠΌΠΎΠ΄ΡƒΠ»ΡŒ синхронизации ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Timing.py. ΠŸΡ€ΠΎΡΡ‚ΠΎ помСститС этот Ρ„Π°ΠΉΠ» Π² свой ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΈ Π½Π°Ρ‡Π½ΠΈΡ‚Π΅ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ. ЕдинствСнная внСшняя Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ β€” это runstats, которая ΠΎΠΏΡΡ‚ΡŒ ΠΆΠ΅ Π½Π΅Π²Π΅Π»ΠΈΠΊΠ°.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π»ΡŽΠ±ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, просто поставив ΠΏΠ΅Ρ€Π΅Π΄ Π½Π΅ΠΉ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€:

 врСмя ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°
@timing.MeasureTime
ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ MyBigFunc():
    #сдСлай Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ, ΠΎΡ‚Π½ΠΈΠΌΠ°ΡŽΡ‰Π΅Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ
    для я в диапазонС (10000):
        ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (я)
врСмя.print_all_timings()
 

Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ΄Π°, просто помСститС Π΅Π΅ Π² с Π±Π»ΠΎΠΊΠΎΠΌ :

 врСмя ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°
#Π³Π΄Π΅-Ρ‚ΠΎ Π² ΠΌΠΎΠ΅ΠΌ ΠΊΠΎΠ΄Π΅
со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ.MeasureBlockTime("MyBlock"):
    #сдСлай Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ, ΠΎΡ‚Π½ΠΈΠΌΠ°ΡŽΡ‰Π΅Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ
    для я в диапазонС (10000):
        ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (я)
# ΠΎΡΡ‚Π°Π»ΡŒΠ½Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ ΠΌΠΎΠ΅Π³ΠΎ ΠΊΠΎΠ΄Π°
врСмя.print_all_timings()
 

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π°:

БущСствуСт нСсколько Π½Π΅Π΄ΠΎΡ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Ρ… вСрсий, поэтому я Ρ…ΠΎΡ‡Ρƒ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ нСсколько основных ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠ²:

  1. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ ΠΈΠ· timeit вмСсто time.time ΠΏΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ, описанным Ρ€Π°Π½Π΅Π΅.
  2. ΠŸΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ сборщик мусора Π²ΠΎ врСмя синхронизации.
  3. Decorator ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈΠ»ΠΈ бСзымянными ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ.
  4. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ Π² Π±Π»ΠΎΠΊΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ с time.MeasureBlockTime() ΠΊΠ°ΠΊ t , Π° Π·Π°Ρ‚Π΅ΠΌ t.elapsed ).
  5. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ gc Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΌ для синхронизации Π±Π»ΠΎΠΊΠΎΠ².

2

ИспользованиС time.time для измСрСния выполнСния Π΄Π°Π΅Ρ‚ Π²Π°ΠΌ ΠΎΠ±Ρ‰Π΅Π΅ врСмя выполнСния Π²Π°ΡˆΠΈΡ… ΠΊΠΎΠΌΠ°Π½Π΄, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ врСмя выполнСния, Π·Π°Ρ‚Ρ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌΠΎΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ процСссами Π½Π° вашСм ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅. Π­Ρ‚ΠΎ врСмя, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π·Π°ΠΌΠ΅Ρ‡Π°Π΅Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ, Π½ΠΎ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊΠΎΠ΄Π°/Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹/Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ/…

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ информация ΠΎ timeit :

  • ИспользованиС модуля timeit
  • timeit β€” ВрСмя выполнСния Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΊΠΎΠ΄Π° Python

Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π³Π»ΡƒΠ±ΠΆΠ΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅:

  • http://wiki.python.org/moin/PythonSpeed/PerformanceTips#Profiling_Code
  • Как Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ скрипт Python?

ОбновлСниС : я ΠΌΠ½ΠΎΠ³ΠΎ использовал http://pythonhosted. org/line_profiler/ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ послСднСго Π³ΠΎΠ΄Π° ΠΈ ΡΡ‡ΠΈΡ‚Π°ΡŽ Π΅Π³ΠΎ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ ΠΈ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ вмСсто модуля профиля Python.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠ°. Π­Ρ‚ΠΎ Π΄Π°Π΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΡŒ.

 ΠΏΡ€ΠΎΡ„ΠΈΠ»ΡŒ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°
profile.run('основной()')
 

Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅:

 5 Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π·Π° 0,047 сСкунды
   УпорядочСно: стандартноС имя
   ncalls tottime percall cumtime percall имя Ρ„Π°ΠΉΠ»Π°:lineno(функция)
        1 0,000 0,000 0,000 0,000 :0(исполнСниС)
        1 0,047 0,047 0,047 0,047 :0(ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΠΏΡ€ΠΎΡ„ΠΈΠ»ΡŒ)
        1 0,000 0,000 0,000 0,000 <строка>:1(<ΠΌΠΎΠ΄ΡƒΠ»ΡŒ>)
        0 0,000 0,000 ΠΏΡ€ΠΎΡ„ΠΈΠ»ΡŒ:0(ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ)
        1 0,000 0,000 0,047 0,047 ΠΏΡ€ΠΎΡ„ΠΈΠ»ΡŒ:0(основной())
        1 0,000 0,000 0,000 0,000 two_sum.py:2(twoSum)
 

Π― нашСл это ΠΎΡ‡Π΅Π½ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ.

1

ΠœΠΎΠ΄ΡƒΠ»ΠΈ Python cProfile ΠΈ pstats ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ ΠΎΡ‚Π»ΠΈΡ‡Π½ΡƒΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ для измСрСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΏΡ€ΠΎΡˆΠ΅Π΄ΡˆΠ΅Π³ΠΎ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… функциях, Π±Π΅Π· нСобходимости Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΊΠΎΠ΄ Π²ΠΎΠΊΡ€ΡƒΠ³ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

НапримСр, Ссли Ρƒ вас Π΅ΡΡ‚ΡŒ скрипт python timeFunctions.py:

 врСмя ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°
ΠΏΡ€ΠΈΠ²Π΅Ρ‚ ():
    Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ "ΠŸΡ€ΠΈΠ²Π΅Ρ‚ :)"
    врСмя сна (0,1)
спасибо ():
    ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ "Бпасибо!"
    врСмя сна (0,05)
для idx в диапазонС (10):
    ΠΏΡ€ΠΈΠ²Π΅Ρ‚()
для idx в диапазонС (100):
    Бпасибо()
 

Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ ΠΈ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ статистику для Ρ„Π°ΠΉΠ»Π°, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ просто Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ:

 python -m cProfile -o timeStats.profile timeFunctions.py
 

ΠŸΡ€ΠΈ этом ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ cProfile для профилирования всСх Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² timeFunctions.py ΠΈ сбора статистики Π² Ρ„Π°ΠΉΠ»Π΅ timeStats.profile. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΊΠΎΠ΄ Π² ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ (timeFunctions.py), ΠΈ это ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ с Π»ΡŽΠ±Ρ‹ΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ.

Когда Ρƒ вас Π΅ΡΡ‚ΡŒ Ρ„Π°ΠΉΠ» статистики, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ pstats ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

 python -m pstats timeStats.profile
 

ЗапускаСт ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ статистики, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ мноТСство приятных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Для вашСго ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ случая использования Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ просто ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ статистику для вашСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° статистики для ΠΎΠ±Π΅ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π°ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

 Π”ΠΎΠ±Ρ€ΠΎ ΠΏΠΎΠΆΠ°Π»ΠΎΠ²Π°Ρ‚ΡŒ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ статистики профиля.
timeStats.profile% статистика ΠΏΡ€ΠΈΠ²Π΅Ρ‚
<ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΊΠ° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ> timeStats.profile
         224 Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π·Π° 6,014 сСкунды
   Π‘Ρ‹Π» использован случайный порядок пСрСчислСния
   Бписок сокращСн с 6 Π΄ΠΎ 1 ΠΈΠ·-Π·Π° ограничСния <'hello'>
   ncalls tottime percall cumtime percall имя Ρ„Π°ΠΉΠ»Π°:lineno(функция)
       10 0,000 0,000 1,001 0,100 timeFunctions.py:3(ΠΏΡ€ΠΈΠ²Π΅Ρ‚)
timeStats.profile% статистика спасибо
<ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΊΠ° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ> timeStats.profile
         224 Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π·Π° 6,014 сСкунды
   Π‘Ρ‹Π» использован случайный порядок пСрСчислСния
   Бписок сокращСн с 6 Π΄ΠΎ 1 ΠΈΠ·-Π·Π° ограничСния <'thankyou'>
   ncalls tottime percall cumtime percall имя Ρ„Π°ΠΉΠ»Π°:lineno(функция)
      100 0,002 0,000 5,012 0,050 timeFunctions.py:7(спасибо)
 

Π­Ρ‚ΠΎΡ‚ Ρ„ΠΈΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΌΠ°Π»ΠΎ Ρ‡Ρ‚ΠΎ Π΄Π°Π΅Ρ‚, Π½ΠΎ Π΄Π°Π΅Ρ‚ прСдставлСниС ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ. Π‘Π°ΠΌΠΎΠ΅ приятноС Π² этом ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΠ½Π΅ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΈΠ· ΠΌΠΎΠ΅Π³ΠΎ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΊΠΎΠ΄Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ эти числа ΠΈ, ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, ΠΏΠΎΠΌΠΎΡ‡ΡŒ с ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ.

3

Π’ΠΎΡ‚ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ диспСтчСр контСкста для ΠΊΠΎΠ΄Π° синхронизации —

ИспользованиС:

 ΠΈΠ· эталонного тСста ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°
с эталоном ("ВСст 1+1"):
    1+1
=>
ВСст 1+1: 1.41e-06 сСкунд
 

ΠΈΠ»ΠΈ, Ссли Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ

 с эталоном («ВСст 1+1Β») ΠΊΠ°ΠΊ b:
    1+1
ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (Π±.врСмя)
=>
ВСст 1+1: 7.05e-07 сСкунд
7.05233786763э-07
 

Benchmark.py :

 ΠΈΠ· timeit ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ default_timer ΠΊΠ°ΠΊ Ρ‚Π°ΠΉΠΌΠ΅Ρ€
эталон класса (ΠΎΠ±ΡŠΠ΅ΠΊΡ‚):
    def __init__(self, msg, fmt="%0.3g"):
        self.msg = сообщСниС
        сСлф.Ρ„ΠΌΡ‚ = Ρ„ΠΌΡ‚
    Π·Π°Ρ‰ΠΈΡ‚Π° __enter__(сам):
        self.start = Ρ‚Π°ΠΉΠΌΠ΅Ρ€ ()
        Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ сСбя
    def __exit__(я, *Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹):
        t = Ρ‚Π°ΠΉΠΌΠ΅Ρ€ () - self.start
        print(("%s : " + self.fmt + " сСкунды") % (self.msg, t))
        собствСнноС врСмя = Ρ‚
 

Взято с http://dabeaz.blogspot.fr/2010/02/context-manager-for-timing-benchmarks.html

Π’ΠΎΡ‚ ΠΊΡ€ΠΎΡˆΠ΅Ρ‡Π½Ρ‹ΠΉ класс Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ строку Β«Ρ‡Ρ‡:ΠΌΠΌ:сс»:

 класс Π’Π°ΠΉΠΌΠ΅Ρ€:
  Π·Π°Ρ‰ΠΈΡ‚Π° __init__(сам):
    self. start = врСмя.врСмя()
  ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π·Π°Ρ‰ΠΈΡ‚Ρ‹ (ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ):
    self.start = врСмя.врСмя()
  Π·Π°Ρ‰ΠΈΡ‚Π° get_time_hhmmss (я):
    ΠΊΠΎΠ½Π΅Ρ† = врСмя.врСмя()
    m, s = divmod(end - self.start, 60)
    Ρ‡, ΠΌ = divmod(m, 60)
    time_str = "%02d:%02d:%02d" % (Ρ‡, ΠΌ, с)
    Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ time_str
 

ИспользованиС:

 # Запуск Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°
ΠΌΠΎΠΉ_Ρ‚Π°ΠΉΠΌΠ΅Ρ€ = Π’Π°ΠΉΠΌΠ΅Ρ€()
# ... сдСлай Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ
# ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ строку Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ:
time_hhmmss = my_timer.get_time_hhmmss()
print("ΠŸΡ€ΠΎΡˆΠ»ΠΎ врСмя: %s" % time_hhmmss )
# ... снова ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΉΠΌΠ΅Ρ€
ΠΌΠΎΠΉ_Ρ‚Π°ΠΉΠΌΠ΅Ρ€.restart()
# ... сдСлай Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ
# ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ врСмя:
time_hhmmss = my_timer.get_time_hhmmss()
# ... ΠΈ Ρ‚. Π΄
 

1

(Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с Ipython) Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ %timeit для измСрСния срСднСго Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ:

 def foo():
    Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ "ΠΏΡ€ΠΈΠ²Π΅Ρ‚"
 

, Π° Π·Π°Ρ‚Π΅ΠΌ:

 %timeit foo()
 

Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊΠΎΠΉ:

 10000 Ρ†ΠΈΠΊΠ»ΠΎΠ², Π»ΡƒΡ‡ΡˆΠ΅Π΅ ΠΈΠ· 3: 27 мкс Π½Π° Ρ†ΠΈΠΊΠ»
 

1

МнС нравится простой (python 3):

 ΠΈΠ· timeit ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ timeit
timeit(лямбда: ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ("ΠΏΡ€ΠΈΠ²Π΅Ρ‚"))
 

Π’Ρ‹Π²ΠΎΠ΄ микросСкунд для ΠΎΠ΄Π½ΠΎΠ³ΠΎ выполнСния:

 2. 430883963010274
 

ОбъяснСниС : timeit выполняСт Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ 1 ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ Ρ€Π°Π· ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выдаСтся Π·Π° сСкунд . Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ для 90Β 117 1 ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠ³ΠΎ выполнСния 90Β 118 Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅, Π½ΠΎ Π² срСднСм 90Β 118 микросСкунд Π·Π° 90Β 117 микросСкунд.


Для ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ мСньшСС число ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ, ΠΈΠ½Π°Ρ‡Π΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΆΠ΄Π°Ρ‚ΡŒ Π²Π΅Ρ‡Π½ΠΎ:

 врСмя ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°
timeit(лямбда: time.sleep(1.5), число=1)
 

Π’Ρ‹Π²ΠΎΠ΄ всСгда Π·Π° сСкунд для ΠΎΠ±Ρ‰Π΅Π³ΠΎ числа ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ:

 1.5015795179999714
 

2

Π½Π° python3:

 ΠΈΠ· Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° сна, perf_counter ΠΊΠ°ΠΊ ПК
t0 = ΠΏΠΊ()
ΡΠΏΠ°Ρ‚ΡŒ(1)
ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (ΠΏΠΊ () - t0)
 

элСгантный ΠΈ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΉ.

2

Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ способ использования timeit:

 ΠΈΠ· timeit ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ timeit
Ѐункция опрСдСлСния():
    Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ 1 + 1
врСмя = врСмя (функция, число = 1)
ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (врСмя)
 
 %load_ext змСиная визуализация
%%snakeviz
 

Он просто Π±Π΅Ρ€Π΅Ρ‚ эти 2 строки ΠΊΠΎΠ΄Π° Π² Π±Π»ΠΎΠΊΠ½ΠΎΡ‚Π΅ Jupyter ΠΈ создаСт ΠΊΡ€Π°ΡΠΈΠ²ΡƒΡŽ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΡƒΡŽ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡƒ. НапримСр:

Π’ΠΎΡ‚ ΠΊΠΎΠ΄. ΠžΠΏΡΡ‚ΡŒ ΠΆΠ΅, 2 строки, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠ΅ΡΡ с % , ΡΠ²Π»ΡΡŽΡ‚ΡΡ СдинствСнными Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ строками ΠΊΠΎΠ΄Π°, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΌΠΈ для использования Π·ΠΌΠ΅ΠΈΠ½ΠΎΠΉ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ:

 # !pip install snapviz
%load_ext змСиная визуализация
ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ глобус
ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ…Π΅Ρˆ-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ
%%snakeviz
Ρ„Π°ΠΉΠ»Ρ‹ = glob.glob('*.txt')
def print_files_hashed (Ρ„Π°ΠΉΠ»Ρ‹):
    для Ρ„Π°ΠΉΠ»Π° Π² Ρ„Π°ΠΉΠ»Π°Ρ…:
        с ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ (Ρ„Π°ΠΉΠ») ΠΊΠ°ΠΊ f:
            print(hashlib.md5(f.read().encode('utf-8')).hexdigest())
print_files_hashed(Ρ„Π°ΠΉΠ»Ρ‹)
 9123
t2 = врСмя.врСмя()
ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (t2-t1)
 

7.9870223994e-05

1

Π’ΠΎΡ‚ довольно Ρ…ΠΎΡ€ΠΎΡˆΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ я ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ Π² качСствС ΠΎΠ±Ρ‰Π΅ΠΉ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹:

 ΠΈΠ· functools import wraps
со Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° perf_counter
ΠΎΡ‚ Π²Π²ΠΎΠ΄Π° import Any, Callable, Optional, TypeVar, cast
F = TypeVar("F",bound=Callable[..., Any])
def timer (прСфикс: ΠΠ΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ [str] = НСт, Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ: int = 6) -> Π’Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ [[F], F]:
    """Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π² качСствС Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Π° для опрСдСлСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния любой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. 
    АргумСнты:
        прСфикс: строка для ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ Π΄ΠΎ истСчСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.
            По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ это имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.
        Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ: сколько дСсятичных Π·Π½Π°ΠΊΠΎΠ² Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ сСкунд.
    ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹:
        >>> @Ρ‚Π°ΠΉΠΌΠ΅Ρ€()
        ... ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ foo(x):
        ... Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Ρ…
        >>> Ρ„ΠΎΠΎ(123)
        Ρ„Ρƒ: 0,000... с
        123
        >>> @timer("Π—Π°Ρ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ΅ врСмя: ", 2)
        ... ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ foo(x):
        ... Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Ρ…
        >>> Ρ„ΠΎΠΎ(123)
        Π—Π°Ρ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ΅ врСмя: 0,00 с
        123
    """
    def decorator(func: F) -> F:
        @обСртывания (функция)
        def wrapper(*args: Any, **kwargs: Any) -> Any:
            Π½Π΅Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ прСфикс
            prefix = прСфикс, Ссли прСфикс Π½Π΅ None else f"{func.__name__}: "
            старт = perf_counter()
            Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ = функция (* Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, ** kwargs)
            ΠΊΠΎΠ½Π΅Ρ† = perf_counter()
            print(f"{prefix}{ΠΊΠΎΠ½Π΅Ρ† - Π½Π°Ρ‡Π°Π»ΠΎ:.{Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ}f}s")
            Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚
        Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π½ΠΎΠ΅ Π»ΠΈΡ‚ΡŒΠ΅ (F, ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠ°)
    Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€
 

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования:

 ΠΈΠ· Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°
@Ρ‚Π°ΠΉΠΌΠ΅Ρ€ (Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ = 9)
def take_long(x: int) -> bool:
    Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ x Π² (i для i Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ (x + 1))
Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ = ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚_Π΄ΠΎΠ»Π³ΠΎ(10**8)
ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚)
 

Π’Ρ‹Ρ…ΠΎΠ΄:

 Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚_Π΄ΠΎΠ»Π³ΠΎ: 4,942629056 с
Π˜ΡΡ‚ΠΈΠ½Π½Ρ‹ΠΉ
 

doctests ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ:

 $ python3 -m doctest --verbose -o=ELLIPSIS timer. py
 

И Ρ‚ΠΈΠΏ Π½Π°ΠΌΠ΅ΠΊΠ°Π΅Ρ‚ Π½Π°:

 $ mypy timer.py
 

3

Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ простой Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€:

 врСмя ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°
ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ time_decorator (функция):
    ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠ° def (*args, **kwargs):
        Π½Π°Ρ‡Π°Π»ΠΎ = врСмя.perf_counter()
        original_return_val = func(*args, **kwargs)
        ΠΊΠΎΠ½Π΅Ρ† = врСмя.perf_counter()
        print("ΠΏΡ€ΠΎΡˆΠ΅Π΄ΡˆΠ΅Π΅ врСмя Π²", func.__name__, ": ", end-start, sep='')
        Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ original_return_val
    возвратная ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠ°
 

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

 @timing_decorator
ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ function_to_time():
    врСмя сна(1)
function_to_time()
 

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ function_to_time , ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ, сколько Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ это заняло, ΠΈ имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, замСряСмой ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

3

ΠžΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ·Π΄Π½ΠΈΠΉ ΠΎΡ‚Π²Π΅Ρ‚, Π½ΠΎ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΊΠΎΠΌΡƒ-Ρ‚ΠΎ ΠΎΠ½ пригодится. Π­Ρ‚ΠΎ способ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ я ΡΡ‡ΠΈΡ‚Π°ΡŽ ΠΎΡ‡Π΅Π½ΡŒ чистым.

 врСмя ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°
def timed(fun, *args):
    с = врСмя.врСмя()
    Π³ = вСсСло (*Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹)
    print('{} Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ заняло {} сСкунд.'.format(fun.__name__, time.time()-s))
    Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ (Π³)
timed(ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ, "ΠŸΡ€ΠΈΠ²Π΅Ρ‚")
 

Π˜ΠΌΠ΅ΠΉΡ‚Π΅ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ Β«ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒΒ» β€” это функция Π² Python 3, Π° Π½Π΅ Π² Python 2.7. Однако ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ. Π’Π°ΡˆΠ΅ Π·Π΄ΠΎΡ€ΠΎΠ²ΡŒΠ΅!

2

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ timeit.

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ naive_func, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Python REPL:

 >>> import timeit
>>> ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π°ΠΈΠ²Π½ΠΎΠΉ_Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (Ρ…):
... Π° = 0
... для i в диапазонС (a):
... а += я
... Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ
>>> def wrapper(func, *args, **kwargs):
... Π΄Π΅Ρ„ ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠ°():
... return func(*args, **kwargs)
... возвратная ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠ°
>>> ΠΎΠ±Π΅Ρ€Π½ΡƒΡ‚Ρ‹ΠΉ = ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠ° (naive_func, 1_000)
>>> timeit.timeit(ΠΎΠ±Π΅Ρ€Π½ΡƒΡ‚Ρ‹ΠΉ, число=1_000_000)
0,4458435332577161
 

Π’Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½Π° функция-ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ°, Ссли Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

1

Ѐункция print_elapsed_time Π½ΠΈΠΆΠ΅

 def print_elapsed_time (прСфикс = ''):
    e_time = врСмя.врСмя()
    Ссли нС hasattr(print_elapsed_time, 's_time'):
        print_elapsed_time.s_time = e_time
    Π΅Ρ‰Π΅:
        print(f'{prefix} ΠΏΡ€ΠΎΡˆΠ΅Π΄ΡˆΠ΅Π΅ врСмя: {e_time - print_elapsed_time.s_time:.2f} sec')
        print_elapsed_time.s_time = e_time
 

ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π΅Π³ΠΎ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ

 print_elapsed_time()
....тяТСлыС Ρ€Π°Π±ΠΎΡ‚Ρ‹...
print_elapsed_time('послС тяТСлой Ρ€Π°Π±ΠΎΡ‚Ρ‹')
....Ρ‚ΠΎΠ½Π½Ρ‹ Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… мСст...
print_elapsed_time('послС Ρ‚ΠΎΠ½Π½Ρ‹ Π·Π°Π΄Π°Π½ΠΈΠΉ')
 

Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚

 послС выполнСния тяТСлых Π·Π°Π΄Π°Π½ΠΈΠΉ врСмя: 0,39 сСк.
послС Ρ‚ΠΎΠ½Π½Ρ‹ Π·Π°Π΄Π°Π½ΠΈΠΉ ΠΏΡ€ΠΎΡˆΠ»ΠΎ врСмя: 0,60 сСк.
 

ΠΏΠ»ΡŽΡΡ‹ ΠΈ минусы этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ врСмя Π½Π°Ρ‡Π°Π»Π°

ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ врСмя Π² ΡƒΠ΄ΠΎΠ±ΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΠ΅ врСмя.

 врСмя ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°, Π΄Π°Ρ‚Π° ΠΈ врСмя
Π½Π°Ρ‡Π°Π»ΠΎ = врСмя.часы()
ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ num_multi1 (макс. ):
    Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ = 0
    для числа Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ (0, 1000):
        Ссли (число % 3 == 0 ΠΈΠ»ΠΈ число % 5 == 0):
            Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ += число
    Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ "Π‘ΡƒΠΌΠΌΠ° %d" % Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚
num_multi1 (1000)
ΠΊΠΎΠ½Π΅Ρ† = врСмя.часы()
Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ = ΠΊΠΎΠ½Π΅Ρ† - Π½Π°Ρ‡Π°Π»ΠΎ
ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΊΠ° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ = datetime.datetime.fromtimestamp (Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅)
ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ timestamp.strftime('%Y-%m-%d %H:%M:%S')
 

Π₯отя Π² вопросС это строго Π½Π΅ Π·Π°Π΄Π°Π½ΠΎ, довольно часто трСбуСтся простой ΠΈ ΡƒΠ½ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ способ постСпСнного измСрСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΏΡ€ΠΎΡˆΠ΅Π΄ΡˆΠ΅Π³ΠΎ ΠΌΠ΅ΠΆΠ΄Ρƒ нСсколькими строками ΠΊΠΎΠ΄Π°.

Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Python 3.8 ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ позднюю Π²Π΅Ρ€ΡΠΈΡŽ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ выраТСния присваивания (Ρ‚Π°ΠΊΠΆΠ΅ извСстныС ΠΊΠ°ΠΊ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ walrus), Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ этого довольно элСгантным способом:

 врСмя ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°
Π½Π°Ρ‡Π°Π»ΠΎ, Ρ€Π°Π· = time.perf_counter(), {}
Ρ€Π°ΡΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ("ΠΏΡ€ΠΈΠ²Π΅Ρ‚")
times["print"] = -start + (start := time.perf_counter())
врСмя сна(1.42)
times["sleep"] = -start + (start := time.perf_counter())
a = [n**2 для n в диапазонС (10000)]
Ρ€Π°Π·["pow"] = -start + (start := time. perf_counter())
ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (Ρ€Π°Π·)
 

=>

 {'ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ': 2.193450927734375e-05, 'сон': 1.4210970401763916, 'ΠΌΠΎΡ‰Π½ΠΎΡΡ‚ΡŒ': 0.005671024322509766}
 

Π― сдСлал для этого Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ просто ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это Ρ‚Π°ΠΊ

ΠΈΠ· ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° pythonbenchmark ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ, ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΡ‚ΡŒ
врСмя ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°
Π°, Π±, Π², Π³, Π΄ = 10,10,10,10,10
Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ = [Π°, Π±, Π², Π³, Π΄]
@ΠΌΠ΅Ρ€Π°
def myFunction (Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ):
    врСмя сна (0,4)
@ΠΌΠ΅Ρ€Π°
def myOptimizedFunction (Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ):
    врСмя сна (0,2)
моя функция (Π²Π²ΠΎΠ΄)
ΠΌΠΎΡΠžΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Π°ΡΠ€ΡƒΠ½ΠΊΡ†ΠΈΡ(Π²Π²ΠΎΠ΄)
 

https://github.com/Karlheinzniebuhr/pythonbenchmark

Π­Ρ‚ΠΎΡ‚ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π½Π° основС классов ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ ΠΏΠ΅Ρ‡Π°Ρ‚Π½ΠΎΠ΅ строковоС прСдставлСниС, настраиваСмоС ΠΎΠΊΡ€ΡƒΠ³Π»Π΅Π½ΠΈΠ΅ ΠΈ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ доступ ΠΊ ΠΏΡ€ΠΎΡˆΠ΅Π΄ΡˆΠ΅ΠΌΡƒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² Π²ΠΈΠ΄Π΅ строки ΠΈΠ»ΠΈ числа с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой. Он Π±Ρ‹Π» Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python 3.7.

 ΠΈΠΌΠΏΠΎΡ€Ρ‚ Π΄Π°Ρ‚Ρ‹ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ
ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ врСмя
класс Π’Π°ΠΉΠΌΠ΅Ρ€:
 """Π˜Π·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ использованного Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ."""
 # Бсылка: https://stackoverflow.