Pima wakati wa usindikaji na moduli ya saa ya Python.

Biashara

Kwa kutumia moduli ya saa ya maktaba ya kawaida ya Python, unaweza kupima kwa urahisi wakati wa utekelezaji wa mchakato katika nambari yako. Hii ni muhimu kwa ukaguzi wa haraka.

Kesi mbili zifuatazo zitajadiliwa hapa.

  • Pima katika faili ya Python:timeit.timeit(),timeit.repeat()
  • Kipimo na Daftari ya Jupyter:%timeit,%%timeit

Njia nyingine ni kutumia time.time() kupima muda uliopita katika programu.

Vipimo katika faili za Python: timeit.timeit(), timeit.repeat()

Kama mfano, tutapima muda wa uchakataji wa chaguo za kukokotoa rahisi, test(n), ambayo huhesabu jumla ya nambari n mfululizo.

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

Ukipitisha msimbo unaotaka kupima kama mfuatano kwenye chaguo za kukokotoa timeit.timeit(), itatekelezwa mara NUMBER na muda uliochukua utarejeshwa.
Thamani chaguo-msingi ya nambari ni 1,000,000. Kumbuka kwamba ukitumia thamani chaguo-msingi kwa mchakato unaotumia muda mwingi, itachukua muda mwingi.

Kwa kupitisha globals() kama hoja za kimataifa, msimbo utatekelezwa katika nafasi ya majina ya kimataifa.
Bila hii, jaribio la kazi na kutofautisha n hazitambuliwi katika mfano hapo juu.

Msimbo utakaobainishwa unaweza kuwa kitu kinachoweza kupigiwa simu badala ya mfuatano, kwa hivyo unaweza kubainishwa kama usemi wa lambda usio na hoja; katika hali hii, hoja za kimataifa hazihitaji kubainishwa.

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

Sehemu ya matokeo ni sekunde. Hapa, matokeo ni wakati wa usindikaji kwa kila utekelezaji uliogawanywa na idadi ya utekelezaji.

Ikiwa hautagawanya, thamani ya matokeo itakuwa kubwa zaidi unapoongeza idadi ya utekelezaji.

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

Kwa kutumia kitendakazi cha timeit.repeat(), timeit() inaweza kutekelezwa mara kwa mara. Matokeo yatapatikana kama orodha.

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

Kipimo na Daftari ya Jupyter:%timeit, %%timeit

Katika Jupyter Notebook (IPython), unaweza kutumia amri zifuatazo za uchawi; hakuna haja ya kuagiza moduli ya saa.

  • %timeit
  • %%timeit

%muda

Katika %timeit, bainisha msimbo lengwa ukitenganishwa na nafasi kama hoja za mstari wa amri.

Kwa chaguo-msingi, nambari na kurudia katika timeit.timeit() hubainishwa kiotomatiki. Unaweza pia kuzitaja kwa -n na -r chaguzi.

Matokeo yanakokotolewa kama wastani na mchepuko wa kawaida.

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

%%muda

Amri ya uchawi %%timeit inaweza kutumika kupima muda wa usindikaji wa seli nzima.

Kama mfano, wacha tuendeshe mchakato huo huo kwa kutumia NumPy. Chaguzi za -n na -r zinaweza kuachwa.

Kwa kuwa tunapima muda wa uchakataji wa seli nzima, mfano ufuatao unajumuisha muda wa kuleta 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)

Hakuna haja ya kubainisha msimbo lengwa kama hoja ya %%timeit. Unachohitajika kufanya ni kuandika %%timeit mwanzoni mwa seli, kwa hivyo ndiyo rahisi zaidi kutumia.