मैं दो अनुक्रमों की तत्व-वार तुलना में शुद्ध-पायथन (बाहरी निर्भरताओं के बिना) बनाने की कोशिश कर रहा था। मेरा पहला समाधान था:मानचित्र बनाम starmap का प्रदर्शन?
list(map(operator.eq, seq1, seq2))
तब मैं itertools
से starmap
समारोह पाया है, जो बहुत मेरे लिए समान लग रहा था। लेकिन यह मेरे कंप्यूटर पर सबसे खराब मामले में 37% तेज हो गया। के रूप में यह मेरे लिए स्पष्ट नहीं था, मैं एक जनरेटर से 1 तत्व पुनः प्राप्त करने के समय आवश्यक मापा जाता है (यदि इस तरह से सही है पता नहीं है):
from operator import eq
from itertools import starmap
seq1 = [1,2,3]*10000
seq2 = [1,2,3]*10000
seq2[-1] = 5
gen1 = map(eq, seq1, seq2))
gen2 = starmap(eq, zip(seq1, seq2))
%timeit -n1000 -r10 next(gen1)
%timeit -n1000 -r10 next(gen2)
271 ns ± 1.26 ns per loop (mean ± std. dev. of 10 runs, 1000 loops each)
208 ns ± 1.72 ns per loop (mean ± std. dev. of 10 runs, 1000 loops each)
तत्वों दूसरा समाधान पुन: प्राप्त करने में 24% अधिक performant है । उसके बाद, वे दोनों list
के लिए एक ही परिणाम उत्पन्न करते हैं। लेकिन कहीं से हम समय में अतिरिक्त 13% लाभ:
%timeit list(map(eq, seq1, seq2))
%timeit list(starmap(eq, zip(seq1, seq2)))
5.24 ms ± 29.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
3.34 ms ± 84.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
मैं ऐसे नेस्टेड कोड की रूपरेखा में बेहतर जानकारी के लिए पता नहीं कैसे? तो मेरा सवाल यह है कि पहला जनरेटर पुनः प्राप्त करने में इतनी तेजी से क्यों और list
फ़ंक्शन में हमें अतिरिक्त 13% प्राप्त करने का तरीका क्यों है?
संपादित करें: मेरी पहली इरादा, तत्व के लिहाज से all
के बजाय तुलना प्रदर्शन करने के लिए था, इसलिए all
समारोह list
से बदला गया। यह प्रतिस्थापन समय अनुपात को प्रभावित नहीं करता है।
CPython 3.6.2 Windows 10 (64 बिट) पर
बस का प्रयोग क्यों न 'seq1 = = seq2'? –
@ Błotosmętek सुधार के लिए धन्यवाद! मेरा पहला इरादा 'सभी' के बजाय तत्व-वार तुलना था, जो मेरे प्रश्न से स्पष्ट नहीं था :) वास्तव में यदि आप 'सभी' के बजाय 'सूची' को प्रतिस्थापित करते हैं तो समय के क्रम समान होंगे। – godaygo
क्या पायथन संस्करण? और यह सीपीथन है? – MSeifert