Python standart kitabxanasının timeit modulundan istifadə edərək kodunuzdakı prosesin icra müddətini asanlıqla ölçə bilərsiniz. Bu, sürətli yoxlama üçün faydalıdır.
Burada aşağıdakı iki hal müzakirə olunacaq.
- Python faylında ölçün:
timeit.timeit()
,timeit.repeat()
- Jupyter Notebook ilə ölçmə:
%timeit
,%%timeit
Başqa bir yol, proqramda keçən vaxtı ölçmək üçün time.time() istifadə etməkdir.
Python fayllarında ölçmələr: timeit.timeit(), timeit.repeat()
Nümunə olaraq, ardıcıl n ədədin cəmini hesablayan test(n) adlı sadə funksiyanın emal vaxtını ölçəcəyik.
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
Ölçmək istədiyiniz kodu sətir kimi timeit.timeit() funksiyasına ötürsəniz, o, NUMBER dəfə yerinə yetiriləcək və ona sərf olunan vaxt geri qaytarılacaq.
Nömrə üçün standart dəyər 1.000.000-dır. Nəzərə alın ki, vaxt aparan proses üçün standart dəyəri istifadə etsəniz, bu, çox vaxt aparacaq.
Globals() arqumentini qloballar kimi ötürməklə kod qlobal ad məkanında icra olunacaq.
Bunsuz, funksiya testi və n dəyişəni yuxarıdakı misalda tanınmır.
Müəyyən ediləcək kod sətir əvəzinə çağırıla bilən obyekt ola bilər, ona görə də o, heç bir arqumentsiz lambda ifadəsi kimi göstərilə bilər; bu halda qloballar arqumentinin dəqiqləşdirilməsinə ehtiyac yoxdur.
result = timeit.timeit(lambda: test(n), number=loop)
print(result / loop)
# 0.00027574066299712287
Nəticənin vahidi saniyədir. Burada çıxış bir icra üçün emal vaxtının icraların sayına bölünməsidir.
Bölməsəniz, icraların sayını artırdıqca nəticə dəyəri sadəcə böyüyəcək.
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() funksiyasından istifadə edərək timeit() təkrar icra oluna bilər. Nəticə siyahı şəklində alınacaq.
repeat = 5
print(timeit.repeat(lambda: test(n), repeat=repeat, number=100))
# [0.044914519996382296, 0.039663890027441084, 0.02868645201670006, 0.022745631984435022, 0.023260265996214002]
Jupyter Notebook ilə ölçmə:%timeit, %%timeit
Jupyter Notebook (IPython) proqramında siz aşağıdakı sehrli əmrlərdən istifadə edə bilərsiniz; timeit modulunu idxal etməyə ehtiyac yoxdur.
%timeit
%%timeit
%timeit
%timeit-də komanda xətti arqumentləri kimi boşluqla ayrılmış hədəf kodunu göstərin.
Varsayılan olaraq, timeit.timeit()-də nömrə və təkrar avtomatik olaraq müəyyən edilir. Siz onları -n və -r seçimləri ilə də təyin edə bilərsiniz.
Nəticələr orta və standart sapma kimi hesablanı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 sehrli əmri bütün hüceyrənin emal vaxtını ölçmək üçün istifadə edilə bilər.
Nümunə olaraq NumPy istifadə edərək eyni prosesi icra edək. -n və -r variantları buraxıla bilər.
Biz bütün xananın emal vaxtını ölçdüyümüz üçün aşağıdakı nümunə NumPy-ni idxal etmək vaxtı ehtiva edir.
%%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)
Hədəf kodunu %%timeit üçün arqument kimi göstərməyə ehtiyac yoxdur. Sizə lazım olan hər şey xananın əvvəlinə %%timeit yazmaqdır, ona görə də istifadə etmək ən asandır.