A Python szabványos könyvtárának timeit moduljával könnyen mérheted a kódodban lévő folyamatok végrehajtási idejét. Ez hasznos egy gyors ellenőrzéshez.
A következő két esetet tárgyaljuk.
- Mérés egy Python fájlban:
timeit.timeit()
,timeit.repeat()
- Mérés a Jupyter Notebook segítségével:
%timeit
,%%timeit
Egy másik lehetőség a time.time() használata a programban eltelt idő mérésére.
Mérések Python fájlokban: timeit.timeit(), timeit.repeat()
Példaként egy egyszerű függvény, a test(n) feldolgozási idejét fogjuk mérni, amely n egymást követő szám összegét számítja ki.
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
Ha a timeit.timeit() függvénynek átadja a mérni kívánt kódot egy karakterláncként, akkor az NÉGYszer fog végrehajtódni, és az ehhez szükséges időt kapja vissza.
A szám alapértelmezett értéke 1,000,000. Vegye figyelembe, hogy ha az alapértelmezett értéket használja egy időigényes folyamathoz, az sok időt vesz igénybe.
Ha a globals() paraméterként globals-t adunk meg, a kód a globális névtérben fog végrehajtódni.
Enélkül a fenti példában nem ismerjük fel a test függvényt és az n változót.
A megadandó kód lehet karakterlánc helyett hívható objektum, így megadható argumentumok nélküli lambda-kifejezésként is; ebben az esetben a globals argumentumot nem kell megadni.
result = timeit.timeit(lambda: test(n), number=loop)
print(result / loop)
# 0.00027574066299712287
Az eredmény mértékegysége másodperc. Itt a kimenet a végrehajtásonkénti feldolgozási idő osztva a végrehajtások számával.
Ha nem oszt, akkor az eredmény értéke egyszerűen nagyobb lesz a végrehajtások számának növelésével.
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
A timeit.repeat() függvény használatával a timeit() többször is végrehajtható. Az eredményt listaként kapjuk meg.
repeat = 5
print(timeit.repeat(lambda: test(n), repeat=repeat, number=100))
# [0.044914519996382296, 0.039663890027441084, 0.02868645201670006, 0.022745631984435022, 0.023260265996214002]
Mérés a Jupyter Notebook segítségével:%timeit, %%timeit
A Jupyter Notebookban (IPython) a következő varázslatos parancsokat használhatja; a timeit modult nem kell importálni.
%timeit
%%timeit
%timeit
A %timeit-ben adja meg a célkódot szóközzel elválasztva, mint a parancssori argumentumokat.
Alapértelmezés szerint a timeit.timeit()-ben szereplő szám és ismétlés automatikusan meghatározásra kerül. A -n és -r opciókkal is megadhatja őket.
Az eredményeket átlag és szórás formájában számították ki.
%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
A %%timeit mágikus paranccsal egy teljes cella feldolgozási ideje mérhető.
Példaként futtassuk le ugyanezt a folyamatot NumPy segítségével. A -n és -r opciók elhagyhatók.
Mivel a teljes cella feldolgozási idejét mérjük, a következő példa tartalmazza a NumPy importálásának idejét is.
%%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)
Nem szükséges a célkódot megadni a %%timeit argumentumaként. Mindössze annyit kell tennie, hogy a %%timeit-et a cella elejére írja, így ez a legkönnyebben használható.