Mjerite vrijeme obrade s Pythonovim timeit modulom.

Poslovanje

Koristeći timeit modul standardne biblioteke Python, možete jednostavno izmjeriti vrijeme izvršenja procesa u vašem kodu. Ovo je korisno za brzu provjeru.

Ovdje će se raspravljati o sljedeća dva slučaja.

  • Mjerenje u Python datoteci:timeit.timeit(),timeit.repeat()
  • Mjerenje s Jupyter Notebookom:%timeit,%%timeit

Drugi način je korištenje time.time() za mjerenje proteklog vremena u programu.

Mjerenja u Python datotekama: timeit.timeit(), timeit.repeat()

Kao primjer, izmjerit ćemo vrijeme obrade jednostavne funkcije, test(n), koja izračunava zbroj n uzastopnih brojeva.

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

Ako proslijedite kod koji želite izmjeriti kao string funkciji timeit.timeit(), on će se izvršiti BROJ puta i vratit će se vrijeme koje je trebalo.
Zadana vrijednost za broj je 1.000.000. Imajte na umu da ako koristite zadanu vrijednost za dugotrajan proces, to će potrajati puno vremena.

Prosljeđivanjem globals() kao argumenta globals, kod će se izvršiti u globalnom prostoru imena.
Bez toga, test funkcije i varijabla n nisu prepoznati u gornjem primjeru.

Kod koji treba navesti može biti objekt koji se može pozvati umjesto niza, tako da se može navesti kao lambda izraz bez argumenata; u ovom slučaju, argument globals ne treba specificirati.

result = timeit.timeit(lambda: test(n), number=loop)
print(result / loop)
# 0.00027574066299712287

Jedinica rezultata je sekunde. Ovdje je izlaz vrijeme obrade po izvršenju podijeljeno s brojem izvršenja.

Ako ne podijelite, vrijednost rezultata jednostavno će postati veća kako povećavate broj izvršenja.

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

Koristeći timeit.repeat() funkciju, timeit() se može izvršiti više puta. Rezultat će se dobiti kao lista.

repeat = 5
print(timeit.repeat(lambda: test(n), repeat=repeat, number=100))
# [0.044914519996382296, 0.039663890027441084, 0.02868645201670006, 0.022745631984435022, 0.023260265996214002]

Mjerenje s Jupyter Notebookom:%timeit, %%timeit

U Jupyter Notebooku (IPython) možete koristiti sljedeće čarobne naredbe; nema potrebe za uvozom modula timeit.

  • %timeit
  • %%timeit

%timeit

U %timeit navedite ciljni kod odvojen razmakom poput argumenata retka za naredbe.

Prema zadanim postavkama, broj i ponavljanje u timeit.timeit() određuju se automatski. Također ih možete odrediti s opcijama -n i -r.

Rezultati se izračunavaju kao srednja vrijednost i standardna devijacija.

%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)

%%vrijeme

Čarobna naredba %%timeit može se koristiti za mjerenje vremena obrade cijele ćelije.

Kao primjer, pokrenimo isti proces koristeći NumPy. Opcije -n i -r mogu se izostaviti.

Budući da mjerimo vrijeme obrade cijele ćelije, sljedeći primjer uključuje vrijeme za uvoz 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)

Nema potrebe specificirati ciljni kod kao argument za %%timeit. Sve što trebate učiniti je napisati %%timeit na početku ćelije, tako da je najjednostavniji za korištenje.