هل قائمة الفهم في بيثون تقلل بطريقة فعالة الذاكرة?
سؤال
أنا مبتدئ في بيثون ، وهذا هو أول وظيفة لي ، لذلك لا تكون قاسية جدا :).لقد كنت ألعب مع بايثون مؤخرا وكنت أتساءل عما إذا كان هناك شيء مثل
max([x for x in range(25)])
سيؤدي إلى قيام بايثون أولا بإنشاء قائمة بجميع العناصر ثم العثور على الحد الأقصى ، مما يؤدي إلى وقت(2 ن) ، أو أنه سيتتبع الحد الأقصى كما كان يتكرر لـ Θ(ن).أيضا ، نظرا لأن النطاق يختلف في الثعبان 3 (كونه قابلا للتكرار) ، فهل سيجعله مختلفا عن الثعبان 2?
المحلول
المثال الخاص بك سوف يؤدي إلى بيثون أولا بناء القائمة بأكملها.إذا كنت ترغب في تجنب ذلك ، يمكنك استخدام تعبير مولد بدلا من ذلك:
max((x for x in range(25)))
أو ببساطة:
max(x for x in range(25))
بالطبع (في بيثون 2), range
في حد ذاته يبني قائمة كاملة ، لذلك ما تريد حقا في هذه الحالة هو:
max(x for x in xrange(25))
ومع ذلك ، فيما يتعلق بالوقت المستغرق ، فإن كل هذه التعبيرات لها نفس التعقيد.الفرق المهم هو أن الأخير يتطلب ا(1) الفراغ ، بينما يتطلب الآخرون ا (ن) الفراغ.
نصائح أخرى
تعمل عمليات فهم القائمة دائمًا على إنشاء قائمة (ما لم يطرح شيء استثناء).يوصى باستخدام النوع بدلاً من ذلك في معظم الحالات. Genacodicetagpre