Pythonin standardikirjaston timeit-moduulin avulla voit helposti mitata prosessin suoritusajan koodissasi. Tämä on hyödyllistä nopeaa tarkistusta varten.
Seuraavassa käsitellään kahta seuraavaa tapausta.
- Toimenpide Python-tiedostossa:
timeit.timeit()
,timeit.repeat()
- Mittaaminen Jupyter Notebookilla:
%timeit
,%%timeit
Toinen tapa on käyttää time.time() -ohjelmaa ohjelman kuluneen ajan mittaamiseen.
Mittaukset Python-tiedostoissa: timeit.timeit(), timeit.repeat()
Esimerkkinä mitataan yksinkertaisen funktion test(n), joka laskee n peräkkäisen luvun summan, käsittelyaikaa.
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
Jos annat mitattavan koodin merkkijonona timeit.timeit()-funktiolle, se suoritetaan NUMERO kertoja ja siihen kulunut aika palautetaan.
Numeron oletusarvo on 1 000 000. Huomaa, että jos käytät oletusarvoa aikaa vievässä prosessissa, se vie paljon aikaa.
Välittämällä globals() argumenttina globals, koodi suoritetaan globaalissa nimiavaruudessa.
Ilman tätä funktiota test ja muuttujaa n ei tunnisteta yllä olevassa esimerkissä.
Määriteltävä koodi voi olla merkkijonon sijasta kutsuttava objekti, joten se voidaan määrittää lambda-lausekkeena ilman argumentteja; tässä tapauksessa argumenttia globals ei tarvitse määrittää.
result = timeit.timeit(lambda: test(n), number=loop)
print(result / loop)
# 0.00027574066299712287
Tuloksen yksikkö on sekuntia. Tässä tuloksena on suorituskohtainen käsittelyaika jaettuna suoritusten lukumäärällä.
Jos et jaa, tulosarvo yksinkertaisesti kasvaa, kun suoritusten määrää lisätään.
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
Käyttämällä timeit.repeat()-funktiota timeit() voidaan suorittaa toistuvasti. Tulos saadaan luettelona.
repeat = 5
print(timeit.repeat(lambda: test(n), repeat=repeat, number=100))
# [0.044914519996382296, 0.039663890027441084, 0.02868645201670006, 0.022745631984435022, 0.023260265996214002]
Mittaaminen Jupyter Notebookilla:%timeit, %%timeit
Jupyter Notebookissa (IPython) voit käyttää seuraavia taikakomentoja; timeit-moduulia ei tarvitse tuoda.
%timeit
%%timeit
%timeit
Määritä %timeit-kentässä kohdekoodi välilyönnillä erotettuna kuten komentoriviargumentit.
Oletusarvoisesti timeit.timeit():n numero ja toisto määritetään automaattisesti. Voit määrittää ne myös -n- ja -r-valinnoilla.
Tulokset lasketaan keskiarvona ja keskihajontana.
%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
Taikakomennolla %%timeit voidaan mitata koko solun käsittelyaika.
Esimerkkinä suoritetaan sama prosessi NumPy-ohjelmalla. Vaihtoehdot -n ja -r voidaan jättää pois.
Koska mittaamme koko solun käsittelyaikaa, seuraava esimerkki sisältää NumPy:n tuomiseen kuluvan ajan.
%%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)
Kohdekoodia ei tarvitse määrittää %%timeitin argumenttina. Sinun tarvitsee vain kirjoittaa %%timeit solun alkuun, joten sitä on helpoin käyttää.