تكرار السؤال: …
الإجابة المختصرة
تقلل الـ generators ذروة استهلاك الذاكرة لأنها تنتج العناصر عند الطلب، لكنها لا تسرّع المعالجة بالضرورة، وقد تكون أبطأ إذا احتجت المرور على البيانات عدة مرات.
الشرح
الـ generator مثالي للمعالجة المتدفقة: قراءة ملف ضخم وتصفيته وتجميعه دون تحميله كاملًا. لكن إذا كنت ستمر على النتائج أكثر من مرة، أو تحتاج len أو وصولًا بالفهرس أو ترتيبًا، فبناء list مرة واحدة أسرع وأوضح. لكل خطوة في الـ generator عبء صغير لاستئناف الدالة. قِس الذاكرة والزمن معًا قبل الحكم.
مثال بالكود
import sys
squares_list = [n * n for n in range(1_000_000)]
squares_gen = (n * n for n in range(1_000_000))
print(sys.getsizeof(squares_list)) # ~8 MB للمؤشرات وحدها
print(sys.getsizeof(squares_gen)) # ~200 bytes
total = sum(squares_gen) # استهلاك واحد فقطأخطاء شائعة
- تحويل generator إلى list ثم المرور عليه مرة واحدة فقط.
- استخدام generator ثم المرور عليه مرتين فتكون النتيجة الثانية فارغة.