Meranie času spracovania pomocou modulu timeit jazyka Python.

obchodné

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.

Copied title and URL