Z modulom timeit standardne knjižnice Python lahko preprosto izmerite čas izvajanja procesa v svoji kodi. To je uporabno za hitro preverjanje.
Tu bosta obravnavana naslednja dva primera.
- Ukrep v datoteki Python:
timeit.timeit()
,timeit.repeat()
- Merjenje z beležnico Jupyter:
%timeit
,%%timeit
Drug način je uporaba funkcije time.time() za merjenje pretečenega časa v programu.
Meritve v Pythonovih datotekah: timeit.timeit(), timeit.repeat()
Kot primer bomo izmerili čas obdelave preproste funkcije test(n), ki izračuna vsoto n zaporednih števil.
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
Če funkciji timeit.timeit() posredujete kodo, ki jo želite izmeriti, kot niz, se bo izvedla ŠTEVILO krat in vrnjen bo čas, ki je trajal.
Privzeta vrednost za število je 1.000.000. Upoštevajte, da bo postopek, ki zahteva veliko časa, trajal veliko časa, če boste za časovno potraten postopek uporabili privzeto vrednost.
Če kot argument posredujete globals() globals, se koda izvede v globalnem imenskem prostoru.
Brez tega funkcija test in spremenljivka n v zgornjem primeru nista prepoznani.
Koda, ki jo je treba navesti, je lahko namesto niza objekt, ki ga je mogoče klicati, zato jo je mogoče navesti kot izraz lambda brez argumentov; v tem primeru argumenta globals ni treba navesti.
result = timeit.timeit(lambda: test(n), number=loop)
print(result / loop)
# 0.00027574066299712287
Enota rezultata so sekunde. Rezultat je čas obdelave na izvedbo, deljen s številom izvedb.
Če ne delite, se bo vrednost rezultata z večanjem števila izvedb preprosto povečevala.
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
S funkcijo timeit.repeat() lahko funkcijo timeit() izvajate večkrat. Rezultat se dobi kot seznam.
repeat = 5
print(timeit.repeat(lambda: test(n), repeat=repeat, number=100))
# [0.044914519996382296, 0.039663890027441084, 0.02868645201670006, 0.022745631984435022, 0.023260265996214002]
Merjenje z beležnico Jupyter:%timeit, %%timeit
V beležnici Jupyter (IPython) lahko uporabite naslednje čarobne ukaze; modula timeit ni treba uvoziti.
%timeit
%%timeit
%timeit
V %timeit navedite ciljno kodo, ki je ločena s presledkom kot argumenti ukazne vrstice.
Privzeto sta število in ponovitev v funkciji timeit.timeit() določena samodejno. Določite ju lahko tudi z možnostma -n in -r.
Rezultati so izračunani kot povprečje in standardni odklon.
%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
S čarobnim ukazom %%timeit lahko izmerite čas obdelave celotne celice.
Kot primer izvedimo enak postopek z uporabo programa NumPy. Možnosti -n in -r lahko izpustimo.
Ker merimo čas obdelave celotne celice, naslednji primer vključuje tudi čas uvoza 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)
Ciljne kode ni treba navesti kot argument za %%timeit. Vse, kar morate storiti, je napisati %%timeit na začetku celice, zato je njegova uporaba najlažja.