شرح المفهوم
هذا الدرس ليس لتحويلك إلى مهندس أداء في يوم واحد. إنه يتعلق ببناء غريزة صحية: بعض الأكواد تؤدي نفس المهمة بطريقة أنظف وأسرع، ويجب أن تتعلم كيف تلاحظ ذلك دون أن تصبح مهووسًا بفروق السرعة الضئيلة. الكثير من المبتدئين يكتبون شيئًا يعمل، ثم يفترضون أن الأداء موضوع غامض للمستقبل. الحقيقة أبسط. تبدأ بطرح أسئلة عملية: هل أكرر العمل؟ هل أستخدم أداة قامت بايثون بتحسينها لي بالفعل؟ هل أقيس النتيجة بدلاً من التخمين؟ في هذا الدرس، ستقارن طريقتين لحساب نفس المجموع. إحدى النسخ تستخدم حلقة يدوية. والأخرى تستخدم الدالة المدمجة `sum` في بايثون. كلاهما صحيح. الهدف هو رؤية كيف تؤثر خيارات التصميم الصغيرة على قابلية القراءة ووقت التشغيل. بحلول نهاية هذا الدرس، ستكون قادرًا على: • قياس وقت تشغيل سكريبت صغير دون القلق بشأن الأرقام، • شرح لماذا الأدوات المدمجة غالبًا ما تكون خيارًا افتراضيًا أفضل من كتابة كل شيء يدويًا، • اكتشاف خطأ أداء واضح: القيام بنفس العمل أكثر من مرة دون داعٍ. لماذا هذا مهم: الأداء أسهل للتعلم عندما تتعامل معه كملاحظة، وليس سحرًا. إذا تمكنت من قياس مثال صغير بهدوء، فإن مواضيع الأداء الأكبر لاحقًا ستكون أكثر منطقية بكثير.
أين تضع الكود
- عرّف متغيرات اللون والموضع في الأعلى.
- أنشئ منطق رسم الأشكال أو وضعها في المنتصف.
- اعرض المخرجات (طباعة، لوحة، SVG، أو كتلة منسقة) في النهاية.
مرجع الأوامر
- شغّل السكريبت أكثر من مرة قبل الحكم على النتيجة؛ توقيت واحد بمفرده يمكن أن يكون مضللاً.
- قارن الكود الذي يحل نفس المشكلة، وليس مهمتين مختلفتين تمامًا.
- فضّل دالة مدمجة مثل `sum()` عندما تجعل الكود أوضح وتزيل العمل اليدوي.
- قِس أولاً، ثم حسّن؛ التخمين بشأن السرعة هو كيف يهدر الناس الوقت.
دليل خطوة بخطوة
- شغّل الملف مرة واحدة ودوّن أي نسخة انتهت أسرع على جهازك.
- غيّر `limit` إلى رقم أصغر مثل `50_000`، ثم إلى رقم أكبر مثل `500_000`، وقارن كيف تتغير الأوقات.
- قبل كل تشغيل، توقّع أي نسخة ستكون أسرع ولماذا.
- عدّل الدالة `total_with_loop()` لتقوم بعمل إضافي غير ضروري داخل الحلقة، شغّلها مرة أخرى، ولاحظ مدى سرعة تراكم أوجه القصور الصغيرة.
- اكتب جملة واحدة تشرح الفرق بين الكود الصحيح والكود الصحيح والفعال في آن واحد.
تمارين تطبيقية
- استبدل `sum()` بنهج آخر، مثل تعبير المولد (generator expression) أو `functools.reduce()`، وقارن قابلية القراءة أولاً، ثم السرعة.
- اشرح لماذا الطباعة داخل الجزء الذي تقيس وقته ستجعل قياسك أقل فائدة.
- فكر في ميزة حقيقية واحدة حيث يكون الأداء أكثر أهمية من المعتاد، مثل معالجة العديد من الصفوف، أو تقديم خدمة API، أو تحديث نتيجة لعبة بشكل متكرر.
تحديات برمجية
- استخدم صيغة المتسلسلة الحسابية لحساب نفس المجموع، ثم قارنها بنسخ الحلقة والدالة المدمجة.
- اكتب ملاحظة قصيرة حول متى يجب أن تتوقف عن التحسين وتقبل الحل الأكثر وضوحًا بدلاً من ذلك.
مهام تمرين صغيرة
- احفظ نتيجة تشغيل واحدة في ملاحظاتك لتتمكن من مقارنتها بالتجارب اللاحقة.
- ضع دائرة حول السطر في السكريبت حيث يبدأ القياس وينتهي فعليًا.
- احذف أي كود اختبار بطيء عمدًا بعد الانتهاء حتى تظل النسخة النهائية نظيفة.
خطأ شائع
Mixing x and y axes or using wrong coordinate origin causes shapes to appear in unexpected places.
تحدٍ مصغّر من الواقع
Draw one square, one triangle, and one circle, then move X marker 2 steps right and 1 step down.