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 इतना क्लीनर है।