تقنية

runcall في بايثون: هل يبدأ العداد من جديد كل مرة؟

أول قراءة للعداد 1
التشغيل الأول. [1] [2]

إعادة تشغيل الدالة لا تعني إنشاء سجل جديد هنا. [1] [2]

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

لا؛ نقرأ 1 ثم 2 عند إعادة استعمال الكائن نفسه. [1] [2]

  • ننشئ Profile مرة قبل الحلقة. [1] [2]
  • ننفذ الدالة f مرتين بـruncall. [1] [2]
  • نختار سجلها بهوية f.__code__. [1] [2]
  • القراءة الأولى 1 والثانية 2. [1] [2]
  • اختبرنا 3.12.14؛ لا نقارن زمن التنفيذ. [1] [2]

المثال

import cProfile
def f(): return 'bud'
p=cProfile.Profile()
for _ in range(2):
 p.runcall(f)
 e=next(x for x in p.getstats() if x.code is f.__code__)
 print(e.callcount)

[1] [2]

التشغيل والعد

المصدر هنا يشغل الجمع قبل الدالة ويوقفه بعدها، دون إعادة تهيئة الكائن. القراءتان تخصان عد استدعاءات f المتراكم في مثالنا، لا جميع سجلات المفسر. [1] [2]

قراءة ثانية للعداد 2
الكائن نفسه. [1] [2]

النطاق

عند إنشاء كائن جديد لكل تشغيل، نقرأ 1 في كل مرة. الدالة هنا غير عودية؛ لم نكتب ملف إحصاءات أو نستنتج سرعة من العد. [1] [2]

المراجع

  1. Python 3.12: profiling / runcall
  2. CPython 3.12.14: cProfile.py
  3. موضوع تك: لغة بايثون — مفردات
  4. موضوع تك: تطبيقات بايثون — مفردات

للتوسع: بحث عن لغات البرمجة

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