Pomocou modulu timeit štandardnej knižnice jazyka Python môžete jednoducho merať čas vykonávania procesu vo svojom kóde. Je to užitočné na rýchlu kontrolu.
Budeme sa tu zaoberať nasledujúcimi dvoma prípadmi.
- Meranie v súbore Python:
timeit.timeit()
,timeit.repeat()
- Meranie s Jupyter Notebook:
%timeit
,%%timeit
Ďalším spôsobom je použitie funkcie time.time() na meranie uplynutého času v programe.
Merania v súboroch Python: timeit.timeit(), timeit.repeat()
Ako príklad uvedieme čas spracovania jednoduchej funkcie test(n), ktorá vypočíta súčet n po sebe idúcich čí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
Ak funkcii timeit.timeit() odovzdáte kód, ktorý chcete merať, ako reťazec, vykoná sa NUMBER krát a vráti sa čas, ktorý trval.
Predvolená hodnota čísla je 1 000 000. Upozorňujeme, že ak použijete predvolenú hodnotu pre časovo náročný proces, bude trvať dlho.
Ak ako argument globals() odovzdáte globals, kód sa vykoná v globálnom mennom priestore.
Bez toho sa funkcia test a premenná n vo vyššie uvedenom príklade nerozpoznajú.
Kód, ktorý sa má zadať, môže byť namiesto reťazca volateľný objekt, takže ho možno zadať ako lambda výraz bez argumentov; v tomto prípade nie je potrebné uvádzať argument globals.
result = timeit.timeit(lambda: test(n), number=loop)
print(result / loop)
# 0.00027574066299712287
Jednotkou výsledku sú sekundy. Tu je výstupom čas spracovania na jedno vykonanie vydelený počtom vykonaní.
Ak nedelíte, výsledná hodnota sa jednoducho zväčší, keď sa zvýši počet vykonaní.
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
Pomocou funkcie timeit.repeat() možno funkciu timeit() vykonávať opakovane. Výsledok sa získa ako zoznam.
repeat = 5
print(timeit.repeat(lambda: test(n), repeat=repeat, number=100))
# [0.044914519996382296, 0.039663890027441084, 0.02868645201670006, 0.022745631984435022, 0.023260265996214002]
Meranie s Jupyter Notebook:%timeit, %%timeit
V Jupyter Notebook (IPython) môžete použiť nasledujúce magické príkazy; nie je potrebné importovať modul timeit.
%timeit
%%timeit
%timeit
V %timeit zadajte cieľový kód oddelený medzerou ako argumenty príkazového riadku.
V predvolenom nastavení sa číslo a opakovanie v timeit.timeit() určujú automaticky. Môžete ich tiež určiť pomocou možností -n a -r.
Výsledky sú vypočítané ako priemer a štandardná odchýlka.
%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
Na meranie času spracovania celej bunky možno použiť magický príkaz %%timeit.
Ako príklad uvedieme rovnaký proces s použitím NumPy. Voľby -n a -r možno vynechať.
Keďže meriame čas spracovania celej bunky, nasledujúci príklad zahŕňa aj čas 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)
Cieľový kód nie je potrebné uvádzať ako argument pre %%timeit. Jediné, čo musíte urobiť, je napísať %%timeit na začiatok bunky, takže je to najjednoduchšie použitie.