زمان پردازش را با ماژول timeit پایتون اندازه گیری کنید.

کسب و کار

با استفاده از ماژول timeit کتابخانه استاندارد پایتون، می توانید به راحتی زمان اجرای یک فرآیند را در کد خود اندازه گیری کنید. این برای بررسی سریع مفید است.

دو مورد زیر در اینجا مورد بحث قرار خواهد گرفت.

  • اندازه گیری در فایل پایتون:timeit.timeit()،timeit.repeat()
  • اندازه گیری با نوت بوک Jupyter:%timeit،%%timeit

راه دیگر استفاده از time.time() برای اندازه گیری زمان سپری شده در برنامه است.

اندازه گیری در فایل های پایتون: 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() ارسال کنید، NUMBER بار اجرا می شود و زمان صرف شده برگردانده می شود.
مقدار پیش فرض عدد 1,000,000 است. توجه داشته باشید که اگر از مقدار پیش‌فرض برای فرآیندی زمان‌بر استفاده کنید، زمان زیادی می‌برد.

با ارسال globals() به عنوان آرگومان جهانی، کد در فضای نام جهانی اجرا می شود.
بدون این، تست تابع و متغیر n در مثال بالا شناسایی نمی شوند.

کدی که باید مشخص شود می تواند به جای رشته، یک شی قابل فراخوانی باشد، بنابراین می تواند به عنوان یک عبارت لامبدا بدون آرگومان مشخص شود. در این مورد، آرگومان globals نیازی به مشخص شدن ندارد.

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 را می توان برای اندازه گیری زمان پردازش کل سلول استفاده کرد.

به عنوان مثال، بیایید همان فرآیند را با استفاده از 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