Python-ның timeit модулімен өңдеу уақытын өлшеңіз.

Іскерлік

Python стандартты кітапханасының timeit модулін пайдалану арқылы кодыңыздағы процестің орындалу уақытын оңай өлшей аласыз. Бұл жылдам тексеру үшін пайдалы.

Мұнда келесі екі жағдай талқыланады.

  • Python файлында өлшеу:timeit.timeit(),timeit.repeat()
  • Jupyter ноутбукімен өлшеу:%timeit,%%timeit

Басқа әдіс – бағдарламада өткен уақытты өлшеу үшін time.time() пайдалану.

Python файлдарындағы өлшемдер: timeit.timeit(), timeit.repeat()

Мысал ретінде біз қатардағы n санның қосындысын есептейтін қарапайым функцияның, test(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() аргументін глобалдар ретінде беру арқылы код жаһандық аттар кеңістігінде орындалады.
Онсыз функция сынағы және 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 жазу керек, сондықтан оны пайдалану ең оңай.