Izip के बजाय ज़िप का उपयोग करना कब बेहतर है?


82

zipइसके बजाय कब उपयोग करना बेहतर है itertools.izip?


के पक्ष में एक कारण zip, स्पष्ट रूप से अभी भी इंगित करने के लायक है, वह यह है कि izipरिटर्न iteratorजो केवल एक बार का पता लगाया जा सकता है। यानी ii = izip(a,b) ; f(ii) ; g(ii), यहां एक खाली सूची []दी गई है g
करणीय

6
FYI करें, पायथन 3 का zipकार्य पायथन 2 है izip। सामान्य तौर पर पायथन 3 ने पुनरावृत्तियों का उपयोग करने के लिए अधिकांश कार्यों को बदल दिया, जैसे रेंज, फिल्टर, तानाशाही कार्य, आदि
चार्ल्स एल।

जवाबों:


44

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


1
क्या पहले मामले में izip का उपयोग करना बेहतर नहीं होगा क्योंकि यह तेजी से पुन: उपयोग करता है और izip का उपयोग नहीं करने का कोई वास्तविक कारण नहीं है?
user1815201

1
@ user1815201: izipकेवल पुनः उपयोग कर लेता tupleहै, तो tupleइससे पहले कि अगले चरण शुरू होता है जारी किया गया था, तो यह आप कुछ भी हासिल नहीं होता है। उस ने कहा, कोई भी नुकसान तुच्छ है, इसलिए मैं सहमत हूं कि izipविशेष रूप से उपयोग नहीं करने का बहुत कम कारण है , listअगर आपको आवश्यकता है तो इसके साथ लपेटकर list; आप वास्तव में from future_builtins import zipPy2 कोड को जोड़कर इसे "उचित" तरीके से कर सकते हैं , जो सादे zipको izip(Py3 संक्रमण के लिए तैयारी) बनाता है ।
शैडो रेंजर

99

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यह तेज है।


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

6

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

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

कुशल अनुक्रमिक प्रसंस्करण से संबंधित पायथन अवधारणाओं को देखें:

"generators" & "yield"
"iterators"
"lazy loading"

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

5

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


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

3
ज़रुरी नहीं। यही कारण है कि मैं इस बात को itertools.izip()छोड़ देता हूं कि शुद्ध लाभ सांख्यिकीय कहां होगा।
इग्नासियो वाज़क्वेज़-अब्राम्स

2
एक मामला, जब आपको एक सूची की आवश्यकता होती है, तब होता है जब आप सूचकांक द्वारा परिणाम की वस्तुओं तक पहुंचने की योजना बनाते हैं या कुल लंबाई खोजने की आवश्यकता होती है। lst = zip(lst_a, lst_b)अनुमति देता है lst[1]या len(lst)। हालाँकि, ilst = itertools.izip(lst_a, lst_n)आप के लिए ilst[1]या प्रयास करने में विफल हो जाएगा len(ilst)
जनवरी Vlcinsky
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.