تكرار السؤال: …
الإجابة المختصرة
لأن عنق الزجاجة الحقيقي نادرًا ما يكون حيث نتوقع، والتحسين دون قياس يضيف تعقيدًا قد لا يغير شيئًا، أو يحسّن جزءًا لا يمثل إلا نسبة ضئيلة من الزمن الكلي.
الشرح
حدد المقياس أولًا (زمن الاستجابة p95 أو الإنتاجية أو الذاكرة)، ثم قِس على بيانات وسيناريو يمثلان الواقع. استخدم timeit للمقارنات الصغيرة لأنه يكرر التشغيل ويقلل الضوضاء، و cProfile لتحديد أين يذهب الوقت في البرنامج كله. قارن قبل وبعد بنفس الظروف، ولا تضحِّ بوضوح الكود من أجل مكسب نظري. وتذكر أن تحسين الخوارزمية أو تقليل استدعاءات I/O يتفوق غالبًا على أي micro-optimization.
مثال بالكود
python -m timeit -s "data = list(range(10_000))" "sum(data)"
python -m timeit -s "data = list(range(10_000))" "total = 0" "for x in data: total += x"
# داخل الكود
import timeit
print(timeit.timeit("sorted(data)", setup="data=list(range(1000))[::-1]", number=1000))أخطاء شائعة
- قياس تشغيل واحد فقط والاعتماد على نتيجة متأثرة بالضوضاء والكاش.
- تحسين دالة تستغرق 1% من الوقت بينما الاستعلام البطيء يستغرق 90%.