Вымярайце час апрацоўкі з дапамогай модуля timeit Python.

Бізнэс

Выкарыстоўваючы модуль timeit стандартнай бібліятэкі Python, вы можаце лёгка вымераць час выканання працэсу ў вашым кодзе. Гэта карысна для хуткай праверкі.

Тут будуць разгледжаны два наступныя выпадкі.

  • Вымярэнне ў файле Python:timeit.timeit(),timeit.repeat()
  • Вымярэнне з дапамогай ноўтбука Jupyter:%timeit,%%timeit

Іншы спосаб – выкарыстоўваць time.time() для вымярэння часу, які прайшоў у праграме.

Вымярэння ў файлах Python: timeit.timeit(), timeit.repeat()

У якасці прыкладу мы вымерым час апрацоўкі простай функцыі test(n), якая вылічае суму n паслядоўных лікаў.

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

Калі вы перадаеце код, які вы хочаце вымераць у выглядзе радка, у функцыю timeit.timeit(), ён будзе выкананы КІЛЬКАСЦЬ разоў, і будзе вернуты час, на які ён патрэбны.
Значэнне па змаўчанні для нумара – 1 000 000. Звярніце ўвагу, што калі вы выкарыстоўваеце значэнне па змаўчанні для працяглага працэсу, гэта зойме шмат часу.

Пры перадачы globals() у якасці аргумента globals, код будзе выкананы ў глабальнай прасторы імёнаў.
Без гэтага тэст функцыі і зменная n не распазнаюцца ў прыведзеным вышэй прыкладзе.

Код, які павінен быць вызначаны, можа быць выкліканым аб’ектам замест радка, таму яго можна задаць у выглядзе лямбда-выразу без аргументаў; у гэтым выпадку глабальныя аргументы паказваць не трэба.

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

Адзінка вынікаў – секунды. Тут вывад – гэта час апрацоўкі на выкананне, падзеленае на колькасць выкананняў.

Калі вы не падзеліце, значэнне выніку проста стане большым па меры павелічэння колькасці выкананняў.

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

Выкарыстоўваючы функцыю timeit.repeat(), timeit() можна выконваць паўторна. Вынік будзе атрыманы ў выглядзе спісу.

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

Вымярэнне з дапамогай ноўтбука Jupyter:%timeit, %%timeit

У Jupyter Notebook (IPython) вы можаце выкарыстоўваць наступныя магічныя каманды; няма неабходнасці імпартаваць модуль timeit.

  • %timeit
  • %%timeit

%timeit

У %timeit укажыце мэтавы код, падзелены прабелам, як аргументы каманднага радка.

Па змаўчанні колькасць і паўтор у timeit.timeit() вызначаюцца аўтаматычна. Вы таксама можаце паказаць іх з дапамогай опцый -n і -r.

Вынікі разлічваюцца як сярэдняе і стандартнае адхіленне.

%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

Магічная каманда %%timeit можа быць выкарыстана для вымярэння часу апрацоўкі ўсёй ячэйкі.

У якасці прыкладу, давайце запусцім той жа працэс з дапамогай NumPy. Параметры -n і -r можна апусціць.

Паколькі мы вымяраем час апрацоўкі ўсёй ячэйкі, наступны прыклад уключае час на імпарт 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)

Няма неабходнасці ўказваць мэтавы код у якасці аргумента для %%timeit. Усё, што вам трэба зрабіць, гэта напісаць %%timeit у пачатку ячэйкі, так што гэта самы просты ў выкарыстанні.

Copied title and URL