zip
इसके बजाय कब उपयोग करना बेहतर है itertools.izip
?
zip
कार्य पायथन 2 है izip
। सामान्य तौर पर पायथन 3 ने पुनरावृत्तियों का उपयोग करने के लिए अधिकांश कार्यों को बदल दिया, जैसे रेंज, फिल्टर, तानाशाही कार्य, आदि
zip
इसके बजाय कब उपयोग करना बेहतर है itertools.izip
?
zip
कार्य पायथन 2 है izip
। सामान्य तौर पर पायथन 3 ने पुनरावृत्तियों का उपयोग करने के लिए अधिकांश कार्यों को बदल दिया, जैसे रेंज, फिल्टर, तानाशाही कार्य, आदि
जवाबों:
जब आप जानते हैं कि आप निर्माण की गई वस्तुओं की पूरी सूची चाहते हैं (उदाहरण के लिए, किसी फ़ंक्शन को पारित करने के लिए जो उस सूची को इन-प्लेस में संशोधित करेगा)। या जब आप उन तर्कों को मजबूर करना चाहते हैं जो आप zip()
उस विशिष्ट बिंदु पर पूरी तरह से मूल्यांकन करने के लिए पारित कर रहे हैं ।
izip
केवल पुनः उपयोग कर लेता tuple
है, तो tuple
इससे पहले कि अगले चरण शुरू होता है जारी किया गया था, तो यह आप कुछ भी हासिल नहीं होता है। उस ने कहा, कोई भी नुकसान तुच्छ है, इसलिए मैं सहमत हूं कि izip
विशेष रूप से उपयोग नहीं करने का बहुत कम कारण है , list
अगर आपको आवश्यकता है तो इसके साथ लपेटकर list
; आप वास्तव में from future_builtins import zip
Py2 कोड को जोड़कर इसे "उचित" तरीके से कर सकते हैं , जो सादे zip
को izip
(Py3 संक्रमण के लिए तैयारी) बनाता है ।
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
इसलिए, यदि आपको एक सूची (एक सूची जैसी वस्तु नहीं) की आवश्यकता है, तो बस 'ज़िप' का उपयोग करें।
इसके अलावा, मेमोरी या साइकिल को बचाने के लिए for 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
यह तेज है।
Itertools पुस्तकालय आम पायथन कार्यों के लिए "पुनरावृत्तियों" प्रदान करता है। इटर्स्टूल डॉक्स से, "जैसे जिप () सिवाय इसके कि यह सूची के बजाय एक पुनरावृत्त लौटाता है।" I में izip () का अर्थ है "पुनरावृत्त"।
पायथन पुनरावृत्त एक "आलसी भरी हुई" अनुक्रम है जो नियमित रूप से स्मृति सूची में स्मृति को बचाता है। तो, आप itertools.izip (a, b) का उपयोग करेंगे जब दो इनपुट a, b स्मृति में एक समय में रखने के लिए बहुत बड़े हैं।
कुशल अनुक्रमिक प्रसंस्करण से संबंधित पायथन अवधारणाओं को देखें:
"generators" & "yield"
"iterators"
"lazy loading"
2.x में, जब आपको पुनरावृत्ति के बजाय सूची की आवश्यकता होती है।
itertools.izip()
छोड़ देता हूं कि शुद्ध लाभ सांख्यिकीय कहां होगा।
lst = zip(lst_a, lst_b)
अनुमति देता है lst[1]
या len(lst)
। हालाँकि, ilst = itertools.izip(lst_a, lst_n)
आप के लिए ilst[1]
या प्रयास करने में विफल हो जाएगा len(ilst)
।
zip
, स्पष्ट रूप से अभी भी इंगित करने के लायक है, वह यह है किizip
रिटर्नiterator
जो केवल एक बार का पता लगाया जा सकता है। यानीii = izip(a,b) ; f(ii) ; g(ii)
, यहां एक खाली सूची[]
दी गई हैg
।