A feldolgozási idő mérése a Python timeit moduljával.

Üzleti

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ó.

Copied title and URL