पायथन में एक खाली सूची बनाना


243

पायथन में एक नई खाली सूची बनाने का सबसे अच्छा तरीका क्या है?

l = [] 

या

l = list()

मैं यह दो कारणों से पूछ रहा हूं:

  1. तकनीकी कारण, जो तेज है। (ओवरहेड का कारण बनता है?)
  2. कोड पठनीयता - कौन सा एक मानक सम्मेलन है।

4
"और तेज"? आपने टाइमटाइम क्यों नहीं चलाया?
S.Lott

जवाबों:


335

यहां बताया गया है कि आप यह जांच सकते हैं कि कौन सा कोड अधिक तेज़ है:

% python -mtimeit  "l=[]"
10000000 loops, best of 3: 0.0711 usec per loop

% python -mtimeit  "l=list()"
1000000 loops, best of 3: 0.297 usec per loop

हालाँकि, व्यवहार में, यह आरंभीकरण आपके कार्यक्रम का सबसे छोटा हिस्सा है, इसलिए इस बारे में चिंता करना शायद गलत है।

पठनीयता बहुत व्यक्तिपरक है। मैं पसंद करता हूं [], लेकिन एलेक्स मार्टेली जैसे कुछ बहुत ही जानकार लोग पसंद करते हैं list()क्योंकि यह प्रशंसनीय है


12
वाह, प्रोफाइलिंग के लिए धन्यवाद। मैं हमेशा से जानना चाहता था कि यह कैसे किया जाता है।
user225312

क्यों करता है list('')देने के []बजाय ['']?
Chris_Rands

ऐसा इसलिए है क्योंकि यह दुर्गंध चलने योग्य प्रकारों से सूची बनाती है, आप 1 से अधिक तर्क में सम्मिलित नहीं कर सकते। (टाइप करने की कोशिश करें list('abcd')और आप सब कुछ समझते हैं)
इवान लावोरोव

133

list()स्वाभाविक रूप से धीमा है [], क्योंकि

  1. अगर आप सिर्फ कुछ और होने के लिए सूची को फिर से परिभाषित नहीं करते हैं, तो प्रतीक लुकअप (पहले से जानने के लिए अजगर के लिए कोई रास्ता नहीं है!), और

  2. वहाँ समारोह आह्वान है,

  3. फिर यह जांचना होगा कि क्या पारित करने योग्य तर्क था (इसलिए यह उसमें से तत्वों के साथ सूची बना सकता है) पीएस। हमारे मामले में कोई नहीं है, लेकिन "अगर" चेक है

ज्यादातर मामलों में गति अंतर हालांकि कोई व्यावहारिक अंतर नहीं करेगा।


38
+1: यह समझना अच्छा लगता है कि क्यों list()धीमी है []!
एरिक ओ लेबिगॉट

2
list()केवल यह जाँचने के लिए कि क्या कोई भी तर्क था या नहीं ... "जाँच करें कि क्या यह चलने योग्य है" और "तत्वों के साथ सूची बनाएँ" बस नहीं होता है; वे केवल तभी लागू होते हैं जब कोई arg होता है। यह भी संभव है कि C कोड []को उसी C कोड के रूप में कहा जाए list()। किसी भी मामले में (सी) के साथ शामिल समय (ए) + (बी) की तुलना में छोटा होगा।
जॉन मचिन

1
@ जॉन माचिन - भ्रम के लिए खेद है, मैं (सी) में क्या मतलब था कि यह जांचने की आवश्यकता होगी कि क्या तर्क था, हाँ। बाकी इस बारे में था कि क्या होगा अगर तर्क थे, जो हमारे मामले में कोई नहीं है
Nas Banov

16

मैं उपयोग करता हूं []

  1. यह तेज़ है क्योंकि सूची संकेतन एक शॉर्ट सर्किट है।
  2. वस्तुओं के साथ एक सूची बनाना , बिना सूची बनाने के समान दिखना चाहिए, इसमें अंतर क्यों होना चाहिए?

3

मैं वास्तव में इसके बारे में नहीं जानता, लेकिन यह मुझे लगता है, अनुभव से, कि jpcgt वास्तव में सही है। निम्नलिखित उदाहरण: यदि मैं निम्नलिखित कोड का उपयोग करता हूं

t = [] # implicit instantiation
t = t.append(1)

दुभाषिया में, फिर कॉलिंग टी मुझे बिना किसी सूची के सिर्फ "टी" देता है, और अगर मैं कुछ और जोड़ता हूं, जैसे

t = t.append(2)

मुझे त्रुटि मिलती है "'कोई नहीं' ऑब्जेक्ट में कोई विशेषता नहीं है 'परिशिष्ट'"। यदि, हालांकि, मैं सूची बनाता हूं

t = list() # explicit instantiation

तब यह ठीक काम करता है।


15
यह कारण है t.append(1)संशोधित tजगह में, यह कुछ भी वापस नहीं करता है, लेकिन Noneऔर आप इस बताए जाते हैं Noneकरने के लिए t। इसलिए सूची के बजाय tअब संदर्भित करता है None। यहां आपकी गलती t=t.append(1)सिर्फ लिखने के बजाय थी t.append(1)। आप के साथ समान व्यवहार देखेंगे list(), इसलिए यहाँ कोई अंतर नहीं है।
Darkonaut

1

सिर्फ @Darkonaut जवाब को उजागर करने के लिए क्योंकि मुझे लगता है कि यह अधिक दृश्यमान होना चाहिए।

new_list = []या new_list = list()दोनों ठीक हैं (प्रदर्शन को अनदेखा कर रहे हैं), लेकिन append()रिटर्न None, परिणामस्वरूप आप नहीं कर सकते new_list = new_list.append(something

मैं इस तरह के रिटर्न के फैसले से बहुत हैरान हूं। छी।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.