Mittaa prosessointiaikaa Pythonin timeit-moduulilla.

liiketoiminta

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