Python-un timeit modulu ilə emal vaxtını ölçün.

Biznes

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.

Copied title and URL