Měření doby zpracování pomocí modulu timeit jazyka Python.

Podnikání

Pomocí modulu timeit standardní knihovny jazyka Python můžete snadno měřit dobu provádění procesu v kódu. To je užitečné pro rychlou kontrolu.

Zde se budeme zabývat následujícími dvěma případy.

  • Měření v souboru Python:timeit.timeit(),timeit.repeat()
  • Měření pomocí Jupyter Notebook:%timeit,%%timeit

Dalším způsobem je použití funkce time.time() pro měření uplynulého času v programu.

Měření v souborech Pythonu: timeit.timeit(), timeit.repeat()

Jako příklad uvedeme čas zpracování jednoduché funkce test(n), která vypočítá součet n po sobě jdoucích čísel.

import timeit

def test(n):
    return sum(range(n))

n = 10000
loop = 1000

result = timeit.timeit('test(n)', globals=globals(), number=loop)
print(result / loop)
# 0.0002666301020071842

Pokud funkci timeit.timeit() předáte kód, který chcete měřit, jako řetězec, bude proveden POČETkrát a bude vrácen čas, který trval.
Výchozí hodnota čísla je 1 000 000. Všimněte si, že pokud použijete výchozí hodnotu pro časově náročný proces, bude trvat dlouho.

Předáním globals() jako argumentu globals se kód provede v globálním jmenném prostoru.
Bez toho nejsou funkce test a proměnná n ve výše uvedeném příkladu rozpoznány.

Kód, který má být zadán, může být místo řetězce volatelný objekt, takže může být zadán jako lambda výraz bez argumentů; v takovém případě není třeba zadávat argument globals.

result = timeit.timeit(lambda: test(n), number=loop)
print(result / loop)
# 0.00027574066299712287

Jednotkou výsledku jsou sekundy. Zde je výsledkem doba zpracování na jedno provedení vydělená počtem provedení.

Pokud nedělíte, výsledná hodnota se s rostoucím počtem provedení jednoduše zvětšuje.

print(timeit.timeit(lambda: test(n), number=1))
print(timeit.timeit(lambda: test(n), number=10))
print(timeit.timeit(lambda: test(n), number=100))
# 0.0003999490290880203
# 0.0038685189792886376
# 0.03517670702422038

Pomocí funkce timeit.repeat() lze timeit() provádět opakovaně. Výsledek bude získán jako seznam.

repeat = 5
print(timeit.repeat(lambda: test(n), repeat=repeat, number=100))
# [0.044914519996382296, 0.039663890027441084, 0.02868645201670006, 0.022745631984435022, 0.023260265996214002]

Měření pomocí Jupyter Notebook:%timeit, %%timeit

V zápisníku Jupyter (IPython) můžete použít následující kouzelné příkazy; modul timeit není třeba importovat.

  • %timeit
  • %%timeit

%timeit

Do pole %timeit zadejte cílový kód oddělený mezerou jako argumenty příkazového řádku.

Ve výchozím nastavení se číslo a opakování v timeit.timeit() určí automaticky. Můžete je také zadat pomocí voleb -n a -r.

Výsledky jsou vypočteny jako průměr a směrodatná odchylka.

%timeit test(n)
# 259 µs ± 4.87 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit -r 3 -n 10000 test(n)
# 237 µs ± 6.44 µs per loop (mean ± std. dev. of 3 runs, 10000 loops each)

%%timeit

Magický příkaz %%timeit lze použít k měření doby zpracování celé buňky.

Jako příklad uveďme stejný proces s použitím NumPy. Volby -n a -r lze vynechat.

Protože měříme dobu zpracování celé buňky, je v následujícím příkladu zahrnuta i doba importu NumPy.

%%timeit -r 3 -n 10000
import numpy as np
a = np.arange(n)
np.sum(a)
# 19.7 µs ± 9.57 µs per loop (mean ± std. dev. of 3 runs, 10000 loops each)

U příkazu %%timeit není třeba jako argument uvádět cílový kód. Stačí napsat %%timeit na začátek buňky, takže jeho použití je nejjednodušší.

Copied title and URL