تقنية

cProfile في بايثون 3.12: هل callcount يستبعد الاستدعاء العودي؟

callcount يساوي أربعة
المجموع المحلي. [1] [2] [3]

نحصي استدعاءات دالة عودية مؤلفة. [1] [2] [3]

الخلاصة السريعة

لا؛ المجموع هنا أربعة، منها ثلاثة عودية. [1] [2] [3]

  • f(3) ينزل إلى f(0). [1] [2] [3]
  • الدالة تعيد 3، أما عدد الاستدعاءات فـ4. [1] [2] [3]
  • callcount يعطي 4 للدالة المختارة. [1] [2] [3]
  • reccallcount يعطي 3؛ دخولها الأول غير عودي. [1] [2] [3]
  • اختبرنا 3.12.14؛ لا نقارن السرعة. [1] [2] [3]

المثال

import cProfile
def f(n):
 return 0 if n==0 else 1+f(n-1)
p=cProfile.Profile()
print(p.runcall(f,3))
e=next(e for e in p.getstats() if e.code is f.__code__)
print(e.callcount,e.reccallcount)

[1] [2] [3]

ما الذي عدّناه؟

السلسلة المؤلفة تمر بالقيم 3,2,1,0: أربعة دخولات. المخرج 3 ثم 4 3. نختار سجل الدالة بهوية كائن شيفرتها، لا نجمع سجلات المفسر كلها. [1] [2] [3]

ثلاثة استدعاءات عودية
التتابع المحلي. [1] [2] [3]

غير العودي

الفرق 4-3=1 استدعاء غير عودي هنا. الاستدعاءات الداخلية الثلاثة داخلة في المجموع؛ ليست أربع دوال مختلفة. [1] [2] [3]

الحدود

حالة أساسية وأعداد صحيحة غير سالبة. نقرأ عدادات التنفيذ؛ لا نستنتج عمقًا عامًا أو تعقيدًا أو مقارنة زمنية من هذه الأرقام. [1] [2] [3]

المراجع

  1. Python3.12: profilers
  2. CPython3.12.14: native getstats
  3. CPython3.12.14: cProfile.py
  4. موضوع تك: لغة بايثون — مفردات
  5. موضوع تك: تطبيقات بايثون — مفردات

أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي، وخضع لمراجعة ذاتية بالأداة نفسها. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.