Bi modula timeitê ya Python re dema pêvajoyê bipîvin.

Dikan

Bi karanîna modula timeit ya pirtûkxaneya standard Python, hûn dikarin bi hêsanî dema pêkanîna pêvajoyek di koda xwe de bipîvin. Ev ji bo kontrolek bilez bikêr e.

Du dozên jêrîn dê li vir werin nîqaş kirin.

  • Pîvana di pelek Python de:timeit.timeit(),timeit.repeat()
  • Pîvana bi Jupyter Notebook:%timeit,%%timeit

Rêyek din ew e ku meriv time.time() bikar bîne ji bo pîvandina dema derbasbûyî ya di bernameyê de.

Pîvandin di pelên Python de: timeit.timeit(), timeit.repeat()

Wek mînak, em ê dema xebitandina fonksiyonek hêsan, test(n) bipîvin, ku berhevoka n hejmarên li pey hev hesab dike.

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

Heke hûn koda ku hûn dixwazin wekî rêzek bipîvin bigihînin fonksiyona timeit.timeit(), ew ê HEJMAR car were darve kirin û wextê ku girtiye dê were vegerandin.
Nirxa standard ji bo hejmarê 1,000,000 e. Hişyar bikin ku heke hûn ji bo pêvajoyek demdirêj nirxa xwerû bikar bînin, ew ê gelek dem bigire.

Bi derbaskirina globals() wekî globalên arguman, kod dê di nav cîhê navên gerdûnî de were darve kirin.
Bêyî vê, testa fonksiyonê û guherbar n di mînaka li jor de nayên naskirin.

Koda ku were destnîşan kirin dikare ji dêvla xêzekê bibe objeyek jêhatî, ji ber vê yekê dikare wekî bêjeyek lambda bê arguman were destnîşan kirin; di vê rewşê de, argumana globals ne hewce ye ku were diyar kirin.

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

Yekîneya encamê saniye ye. Li vir, encam dema pêvajoyê ya her darvekirinê ye ku bi hejmara darvekirinê ve tê dabeş kirin.

Ger hûn dabeş nekin, her ku hûn hejmara darvekirinê zêde bikin dê nirxa encamê bi hêsanî mezintir bibe.

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

Bi karanîna fonksiyona timeit.repeat() re, timeit() dikare çend caran were darve kirin. Encam dê wekî navnîşek were bidestxistin.

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

Pîvana bi Jupyter Notebook:%timeit, %%timeit

Di Jupyter Notebook (IPython) de, hûn dikarin fermanên sêrbaz ên jêrîn bikar bînin; ne hewce ye ku modula timeit were import kirin.

  • %timeit
  • %%timeit

%timeit

Di %timeit de, koda armancê ku ji hêla cîhek wekî argumanên rêzika fermanê ve hatî veqetandin diyar bikin.

Bi xwerû, hejmar û dubarekirina di timeit.timeit() de bixweber têne destnîşankirin. Her weha hûn dikarin wan bi vebijarkên -n û -r diyar bikin.

Encam wekî navgîn û veguheztina standard têne hesibandin.

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

%%dem

Fermana efsûnî %%timeit dikare ji bo pîvandina dema pêvajoyê ya tevahî şaneyek were bikar anîn.

Wekî mînakek, bila em heman pêvajoyê bi karanîna NumPy bimeşînin. Vebijêrkên -n û -r dikarin bêne derxistin.

Ji ber ku em dema pêvajoyê ya tevahiya hucreyê dipîvin, mînaka jêrîn dema importkirina NumPy vedigire.

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

Ne hewce ye ku koda armancê wekî argumanek ji bo %%timeit diyar bike. Tiştê ku divê hûn bikin ev e ku %%timeit di destpêka şaneyê de binivîsin, lewra karanîna wê ya herî hêsan e.