अक्सर पर्याप्त, मुझे जोड़ों द्वारा एक सूची संसाधित करने की आवश्यकता मिली है। मैं सोच रहा था कि यह करने के लिए पायथोनिक और कुशल तरीका कौन सा होगा, और यह Google पर पाया गया:
pairs = zip(t[::2], t[1::2])
मैंने सोचा था कि यह काफी आकर्षक था, लेकिन हाल ही में मुहावरों बनाम दक्षता पर चर्चा के बाद , मैंने कुछ परीक्षण करने का फैसला किया:
import time
from itertools import islice, izip
def pairs_1(t):
return zip(t[::2], t[1::2])
def pairs_2(t):
return izip(t[::2], t[1::2])
def pairs_3(t):
return izip(islice(t,None,None,2), islice(t,1,None,2))
A = range(10000)
B = xrange(len(A))
def pairs_4(t):
# ignore value of t!
t = B
return izip(islice(t,None,None,2), islice(t,1,None,2))
for f in pairs_1, pairs_2, pairs_3, pairs_4:
# time the pairing
s = time.time()
for i in range(1000):
p = f(A)
t1 = time.time() - s
# time using the pairs
s = time.time()
for i in range(1000):
p = f(A)
for a, b in p:
pass
t2 = time.time() - s
print t1, t2, t2-t1
मेरे कंप्यूटर पर ये परिणाम थे:
1.48668909073 2.63187503815 1.14518594742
0.105381965637 1.35109519958 1.24571323395
0.00257992744446 1.46182489395 1.45924496651
0.00251388549805 1.70076990128 1.69825601578
यदि मैं उन्हें सही ढंग से व्याख्या कर रहा हूं, तो इसका मतलब यह होना चाहिए कि पायथन में सूचियों, सूची अनुक्रमण और सूची स्लाइसिंग का कार्यान्वयन बहुत कुशल है। यह आराम और अप्रत्याशित दोनों का परिणाम है।
क्या जोड़ियों में किसी सूची को ट्रेस करने का एक और "बेहतर" तरीका है?
ध्यान दें कि यदि सूची में विषम संख्या में तत्व हैं, तो अंतिम किसी भी जोड़े में नहीं होगा।
यह सुनिश्चित करने का सही तरीका होगा कि सभी तत्व शामिल हैं?
मैंने इन दोनों सुझावों को परीक्षणों के उत्तरों से जोड़ा:
def pairwise(t):
it = iter(t)
return izip(it, it)
def chunkwise(t, size=2):
it = iter(t)
return izip(*[it]*size)
ये परिणाम हैं:
0.00159502029419 1.25745987892 1.25586485863
0.00222492218018 1.23795199394 1.23572707176
अब तक के परिणाम
सबसे अजगर और बहुत कुशल:
pairs = izip(t[::2], t[1::2])
सबसे कुशल और बहुत अजगर:
pairs = izip(*[iter(t)]*2)
मुझे यह समझने में एक पल लगा कि पहला उत्तर दो पुनरावृत्तियों का उपयोग करता है जबकि दूसरा एकल का उपयोग करता है।
तत्वों की एक विषम संख्या के साथ अनुक्रम से निपटने के लिए, सुझाव मूल तत्व को बढ़ाने के लिए किया गया है जिसमें एक तत्व ( None
) है जो पिछले अंतिम तत्व के साथ जोड़ा जाता है, जो कुछ हासिल किया जा सकता है itertools.izip_longest()
।
आखिरकार
ध्यान दें कि, पायथन 3.x में, zip()
व्यवहार करता है itertools.izip()
और itertools.izip()
चला गया है।