2011-02-14 14 views
65

के बजाय zip का उपयोग करना बेहतर है?आईज़िप के बजाय ज़िप का उपयोग करना बेहतर क्यों है?

+0

एक 'zip' के पक्ष में हो, बहुत स्पष्ट अभी भी उनका कहना है लायक, कि' izip' रिटर्न एक 'iterator' है जो कर सकते हैं केवल एक बार घुमाया जा सकता है। यानी 'ii = izip (ए, बी) में; एफ (ii); जी (ii) ', यहां एक खाली सूची' [] '' g' को पास कर दी गई है। – Causality

उत्तर

33

जब आप जानते हैं कि आप निर्मित वस्तुओं की पूरी सूची चाहते हैं (उदाहरण के लिए, उस फ़ंक्शन को पास करने के लिए जो उस सूची को संशोधित करेगा)। या जब आप तर्कों को मजबूर करना चाहते हैं तो आप उस विशिष्ट बिंदु पर पूरी तरह से मूल्यांकन करने के लिए zip() पर जा रहे हैं।

+1

क्या पहले मामले में आईज़िप का उपयोग करना बेहतर नहीं होगा क्योंकि यह तेजी से ट्यूबल का उपयोग करता है और इज़िप का उपयोग न करने का कोई वास्तविक कारण नहीं है? – user1815201

+1

@ user1815201: 'izip' केवल' tuple' का उपयोग करता है अगर अगले पुनरावृत्ति से पहले 'tuple' जारी किया गया था, तो यह आपको कुछ भी प्राप्त नहीं करता है। उस ने कहा, कोई भी नुकसान भी मामूली है, इसलिए मैं मानता हूं कि 'izip' का उपयोग न करने का कोई कारण नहीं है, यदि आपको' सूची 'की आवश्यकता है तो' सूची 'के साथ लपेटना; आप वास्तव में 'भविष्य_बिल्टिन आयात ज़िप' से पी 2 कोड में जोड़कर "उचित" तरीका कर सकते हैं, जो सादे 'ज़िप' को 'izip' (पीई 3 संक्रमण की तैयारी) में बनाता है। – ShadowRanger

4

2.x में, जब आप को एक पुनरावर्तक की बजाय एक सूची की आवश्यकता है।

+0

क्या आप मुझे एक उदाहरण दे सकते हैं जहां ऐसा हो सकता है? –

+3

वास्तव में नहीं। यही कारण है कि मैं 'itertools.izip()' को प्राथमिकता देता हूं, सिवाय इसके कि लाभ पूरी तरह से सांख्यिकीय होगा। –

+2

एक मामला, जब आपको किसी सूची की आवश्यकता होती है, तो जब आप इंडेक्स द्वारा परिणाम के आइटम तक पहुंचने की योजना बनाते हैं या कुल लंबाई ढूंढने की आवश्यकता होती है। 'lst = ज़िप (lst_a, lst_b)' 'lst [1]' या 'len (lst)' की अनुमति देता है। हालांकि, 'ilst = itertools.izip (lst_a, lst_n) के लिए 'आप' [1]' या 'len (ilst)' की कोशिश करने में असफल हो जाएंगे। –

79

zip एक ही समय में सभी सूची की गणना करता है, izip केवल अनुरोध किए जाने पर तत्वों की गणना करता है।

>>> l1 = [1, 2, 3, 4, 5, 6] 
>>> l2 = [2, 3, 4, 5, 6, 7] 
>>> z = zip(l1, l2) 
>>> iz = izip(l1, l2) 
>>> isinstance(zip(l1, l2), list) 
True 
>>> isinstance(izip(l1, l2), list) 
False 
>>> z[::2] #Get odd places 
[(1, 2), (3, 4), (5, 6)] 
>>> iz[::2] #Same with izip 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'itertools.izip' object is unsubscriptable 
:

एक महत्वपूर्ण अंतर 'izip' एक 'izip वस्तु' है, जो एक सूची नहीं है और (जैसे अनुक्रमण के रूप में) सूची विशिष्ट सुविधाओं का समर्थन नहीं करता है देता है, कि 'जिप' एक वास्तविक सूची लौटाता है

तो, यदि आपको किसी सूची की आवश्यकता है (कोई सूची जैसी वस्तु नहीं है), तो बस 'ज़िप' का उपयोग करें।

इसके अलावा, 'izip' स्मृति या चक्रों को बचाने के लिए उपयोगी हो सकता है।

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

lst_a = ... #list with very large number of items 
lst_b = ... #list with very large number of items 
#At each cycle, the next couple is provided 
for a, b in izip(lst_a, lst_b): 
    if a == b: 
     break 
print a 

zip का उपयोग कर गणना की है | सभी(a, b) जोड़ों चक्र प्रवेश करने से पहले।

इसके अलावा, यदि lst_a और lst_b बहुत बड़े हैं (उदाहरण के लाखों रिकॉर्ड), zip(a, b) डबल स्पेस के साथ तीसरी सूची तैयार करेगा।

लेकिन यदि आपके पास छोटी सूचियां हैं, तो शायद zip तेज है।

+4

धन्यवाद। हालांकि, यह मुख्य रूप से उत्तर देता है जब 'izip'' ज़िप 'से बेहतर होता है ... –

+6

आप सही हैं। मैंने अच्छे इरादे से शुरुआत की और फिर सैद्धांतिक सामान में गिर गया ... – Don

3

इटर्टोल्स लाइब्रेरी सामान्य पायथन कार्यों के लिए "इटरेटर" प्रदान करता है। Itertools दस्तावेज़ों से, "ज़िप की तरह() को छोड़कर कि यह एक सूची के बजाय एक पुनरावर्तक देता है।" आईज़िप (i) में I का मतलब है "पुनरावर्तक"।

पायथन इटरेटर्स एक "आलसी लोड" अनुक्रम है जो नियमित रूप से स्मृति सूची में स्मृति बचाता है। तो, आप itertools.izip (ए, बी) का उपयोग करेंगे जब दो इनपुट ए, बी एक समय में स्मृति में रखने के लिए बहुत बड़े हैं।

कुशल अनुक्रमिक प्रसंस्करण से संबंधित अजगर अवधारणाओं को फिर से देखें: अभी तक

"generators" & "yield" 
"iterators" 
"lazy loading" 
+0

अच्छी तरह से समझाया। –

संबंधित मुद्दे