Iteration vs Space , उपयोग एक मुद्दा हो सकता है। विभिन्न स्थितियों में प्रोफाइलिंग या तो "तेज" हो सकती है और / या "कम मेमोरी" गहन हो सकती है।
# first
>>> L = [0, 23, 234, 89, None, 0, 35, 9, ...]
>>> [x for x in L if x is not None]
[0, 23, 234, 89, 0, 35, 9, ...]
# second
>>> L = [0, 23, 234, 89, None, 0, 35, 9]
>>> for i in range(L.count(None)): L.remove(None)
[0, 23, 234, 89, 0, 35, 9, ...]
पहले दृष्टिकोण (के रूप में भी ने सुझाव दिया @jamylak , @Raymond Hettinger , और @Dipto ), स्मृति में एक डुप्लिकेट सूची जो कुछ के साथ एक बड़ी सूची के लिए महंगा हो सकता है बनाता है Noneप्रविष्टियों।
दूसरा दृष्टिकोण सूची के माध्यम से एक बार चला जाता है, और उसके बाद फिर एक जब तक हर बार Noneपहुँच जाता है। यह कम मेमोरी इंटेंसिव हो सकता है, और यह सूची में जाते ही छोटा हो जाएगा। सूची आकार में कमी Noneसे सामने की बहुत सारी प्रविष्टियों के लिए गति हो सकती है , लेकिन सबसे खराब स्थिति यह होगी कि बहुत सारी Noneप्रविष्टियाँ पीछे थीं।
समानांतरकरण और इन-प्लेस तकनीक अन्य दृष्टिकोण हैं, लेकिन पायथन में प्रत्येक की अपनी जटिलताएं हैं। डेटा और रनटाइम उपयोग-मामलों को जानने के साथ-साथ प्रोग्राम को प्रोफाइल करना गहन संचालन या बड़े डेटा के लिए शुरू करना है।
या तो दृष्टिकोण का चयन करना शायद आम स्थितियों में मायने नहीं रखेगा। यह अंकन की एक प्राथमिकता के रूप में अधिक हो जाता है। वास्तव में, उन असामान्य परिस्थितियों में, numpyया cythonमाइक्रोमैनज पायथन ऑप्टिमाइज़ेशन के प्रयास के बजाय सार्थक विकल्प हो सकते हैं।
filterसंस्करण:filter(lambda x: x is not None, L)- आपlambdaउपयोग से छुटकारा पा सकते हैंpartialऔरoperator.is_notमुझे लगता है, लेकिन यह संभवतः इसके लायक नहीं है क्योंकि सूची-COMP इतना क्लीनर है।