2012-09-13 22 views
5

मैं वहाँ किसी भी अच्छे कारण हैं कि क्या सोच रहा हूँ if statments अजगर में एक टपल या ठीक इसके विपरीत पर एक सूची को पसंद करते हैं, तो। तो निम्नलिखित कार्यात्मक रूप से समकक्ष हैं लेकिन प्रदर्शन और कोडिंग शैली के मामले में दूसरे के लिए बेहतर है या इससे कोई फर्क नहीं पड़ता?अजगर में सूचियों और tuples का उपयोग करते हुए बयान

if x in (1,2,3): 
    foo() 

if x in [1,2,3]: 
    foo() 

मैं, मुझे लगता है कि क्योंकि मेरे अनुभव में tuples लघु और सूचियों लंबे हो जाते हैं tuples का उपयोग कर अगर वहाँ कुछ भी के लिए 2 या 3 मूल्यों और सूचियों लंबे समय तक रहे की आदत में मिल गया है लगता है, लेकिन यह एक लगता है थोड़ा मनमानी और शायद अनावश्यक रूप से असंगत।

मैं किसी भी उदाहरण लोगों, जहां एक अन्य की तुलना में बेहतर होगा की दे सकते हैं में रुचि होगी।

चीयर्स

+3

सेट – GP89

+0

दोनों के लिए बेहतर है [सूचियों और tuples के बीच अंतर] (http://stackoverflow.com/questions/626759/whats-the-difference-between-list-and-tuples-in-python) या [प्रत्येक पाइथन सूची बनाम tuple प्रत्येक का उपयोग करने के लिए] (http://stackoverflow.com/questions/1708510/python-list -vs-टपल-जब से उपयोग-प्रत्येक)। – DSM

+0

@ जीपी 8 9: विस्तृत करने की देखभाल? – voithos

उत्तर

5

एक tuple (कम से कम CPython में) की initialisation में सरणियों को समरूप संग्रह के लिए किया जा रहा है heterogenous संग्रह के लिए tuples, सी में structs के समान है, और सूचियों, समान उपयोग करने के लिए कम बाईटकोड का उत्पादन करते हैं list से - लेकिन इसके बारे में चिंता करने के लिए वास्तव में कुछ भी नहीं है। मेरा मानना ​​है कि सदस्यता परीक्षण काफी समान है (हालांकि इसका परीक्षण नहीं किया गया है)।

विशुद्ध रूप से सदस्यता देखने अर्थ विज्ञान के परीक्षण के लिए एक ही हैं। अजगर 2.7 के बाद से, यह लिखने के लिए ज्यादा बेहतर होता है (और एक निहितार्थ यह है कि यह सदस्यता परीक्षण केवल है कहते हैं):

if x in {1, 2, 3}: 
    pass # do something 

जबकि इससे पहले:

if x in set([1,2,3]): 
    pass # do something 

सिर्फ देखा एक छोटे से kludgy ...

+0

धन्यवाद। ईमानदार होने के लिए मुझे एहसास नहीं हुआ था कि आप '{}' 2.7 में उपयोग करके एक सेट बना सकते हैं, जैसा कि आप कहते हैं कि एक सेट के साथ सदस्यता परीक्षण का निहितार्थ अधिक संतोषजनक है! – redrah

+1

मैं कुछ समय किया था और एक सेट शाब्दिक में सदस्यता के लिए कि परीक्षण में पाया गया है * धीमी * एक टपल शाब्दिक में सदस्यता के लिए परीक्षण कर रहा है।शायद यह सेट बनाने के लिए लगने वाले समय के कारण है। लंबे समय तक सेट शाब्दिक था, प्रदर्शन खराब हो गया, भले ही परीक्षण किए गए आइटम सेट के सदस्य न हों। टेकवे यह है कि यदि आप केवल एक बार सदस्यता के लिए परीक्षण करने के लिए एक सेट तैयार करने जा रहे हैं, तो आप एक ट्यूपल से बेहतर हो जाते हैं। यदि आपको एक से अधिक बार परीक्षण करने की आवश्यकता है, तो सेट को प्राथमिकता दी जाती है। –

+1

@ स्टेवेन रूंबल्स्की, खुशी है कि आपने इसका परीक्षण किया - मुझे बहुत संदेह था। कुंजी यह है कि, जैसा कि जॉन क्लेमेंट्स ऊपर बताता है, "एक टुपल (कम से कम सीपीथन में) की शुरुआत एक सूची से कम बाइटकोड उत्पन्न करती है।" यह सिर्फ इतना नहीं है कि एक सेट की तुलना में ट्यूपल बनाने में अधिक समय लगेगा; यह है कि ट्यूपल संकलन समय पर केवल एक बार उत्पादित होता है और फिर [folded] (http://en.wikipedia.org/wiki/Constant_folding) बाइटकोड में निरंतर के रूप में उत्पन्न होता है - जो संभव है, क्योंकि टुपल्स अपरिवर्तनीय हैं । हालांकि, अभी तक एक और जटिलता है: यदि ट्यूपल में उत्परिवर्तनीय मान होते हैं, तो लगातार फोल्डिंग _doesn't_ नहीं होती है। – senderle

0

सूची और टपल के बीच अंतर यह है कि सूचियों अस्थायी होते हैं और tuples अपरिवर्तनीय हो रहा है।

लोग सी