قياس وقت المعالجة باستخدام وحدة الوقت بيثون.

اعمال

باستخدام وحدة timeit في مكتبة Python القياسية ، يمكنك بسهولة قياس وقت تنفيذ عملية في التعليمات البرمجية الخاصة بك. هذا مفيد لفحص سريع.

ستتم مناقشة الحالتين التاليتين هنا.

  • القياس في ملف بايثون:timeit.timeit()وtimeit.repeat()
  • القياس باستخدام دفتر Jupyter:%timeitو%%timeit

هناك طريقة أخرى وهي استخدام time.time () لقياس الوقت المنقضي في البرنامج.

القياسات في ملفات Python: timeit.timeit () ، timeit.repeat ()

كمثال ، سنقوم بقياس وقت معالجة وظيفة بسيطة ، اختبار (ن) ، الذي يحسب مجموع 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 في المثال أعلاه.

يمكن أن تكون الكود المطلوب تحديده كائنًا قابلاً للاستدعاء بدلاً من سلسلة ، لذلك يمكن تحديده كتعبير lambda بدون وسيطات ؛ في هذه الحالة ، لا تحتاج الحجة 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 () تلقائيًا. يمكنك أيضًا تحديدها باستخدام خياري -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 في بداية الخلية ، لذلك فهي أسهل استخدامًا.