मुझे हल करने के लिए इसी तरह की समस्या थी इसलिए मैं इस सवाल पर आया। मैंने एंड्रयू क्लार्क और नारायण के जवाब की तुलना की, जो मैं साझा करना चाहूंगा।
दो उत्तरों के बीच प्राथमिक अंतर यह है कि वे आंतरिक सूचियों पर कैसे पुनरावृत्ति करते हैं। उनमें से एक बिलिन मैप का उपयोग करता है , जबकि अन्य सूची समझ का उपयोग कर रहा है। यदि इसके उपयोग के लंबोदा की आवश्यकता नहीं है, तो मानचित्र फ़ंक्शन को इसकी समकक्ष सूची समझ के लिए थोड़ा प्रदर्शन लाभ है । तो इस सवाल के संदर्भ में map
सूची समझ से थोड़ा बेहतर प्रदर्शन करना चाहिए।
यह देखने के लिए कि क्या यह वास्तव में सच है, एक प्रदर्शन बेंचमार्क देता है। मैंने इन सभी परीक्षणों को करने के लिए अजगर संस्करण 3.5.0 का उपयोग किया। परीक्षणों के पहले सेट में मैं प्रति सूची तत्वों को 10 रखना चाहूँगा और 10-100,000 से सूचियों की संख्या को अलग-अलग करूँगा
>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,10))]*10]"
>>> 100000 loops, best of 3: 15.2 usec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,10))]*10]"
>>> 10000 loops, best of 3: 19.6 usec per loop
>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,10))]*100]"
>>> 100000 loops, best of 3: 15.2 usec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,10))]*100]"
>>> 10000 loops, best of 3: 19.6 usec per loop
>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,10))]*1000]"
>>> 1000 loops, best of 3: 1.43 msec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,10))]*1000]"
>>> 100 loops, best of 3: 1.91 msec per loop
>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,10))]*10000]"
>>> 100 loops, best of 3: 13.6 msec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,10))]*10000]"
>>> 10 loops, best of 3: 19.1 msec per loop
>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,10))]*100000]"
>>> 10 loops, best of 3: 164 msec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,10))]*100000]"
>>> 10 loops, best of 3: 216 msec per loop
परीक्षणों के अगले सेट में मैं प्रति लिस्ट में तत्वों की संख्या बढ़ाकर 100 करना चाहूंगा ।
>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,100))]*10]"
>>> 10000 loops, best of 3: 110 usec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,100))]*10]"
>>> 10000 loops, best of 3: 151 usec per loop
>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,100))]*100]"
>>> 1000 loops, best of 3: 1.11 msec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,100))]*100]"
>>> 1000 loops, best of 3: 1.5 msec per loop
>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,100))]*1000]"
>>> 100 loops, best of 3: 11.2 msec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,100))]*1000]"
>>> 100 loops, best of 3: 16.7 msec per loop
>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,100))]*10000]"
>>> 10 loops, best of 3: 134 msec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,100))]*10000]"
>>> 10 loops, best of 3: 171 msec per loop
>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,100))]*100000]"
>>> 10 loops, best of 3: 1.32 sec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,100))]*100000]"
>>> 10 loops, best of 3: 1.7 sec per loop
आओ हम एक साहसी कदम उठाएँ और सूचियों में तत्वों की संख्या को 1000 तक संशोधित करें
>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,1000))]*10]"
>>> 1000 loops, best of 3: 800 usec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,1000))]*10]"
>>> 1000 loops, best of 3: 1.16 msec per loop
>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,1000))]*100]"
>>> 100 loops, best of 3: 8.26 msec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,1000))]*100]"
>>> 100 loops, best of 3: 11.7 msec per loop
>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,1000))]*1000]"
>>> 10 loops, best of 3: 83.8 msec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,1000))]*1000]"
>>> 10 loops, best of 3: 118 msec per loop
>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,1000))]*10000]"
>>> 10 loops, best of 3: 868 msec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,1000))]*10000]"
>>> 10 loops, best of 3: 1.23 sec per loop
>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,1000))]*100000]"
>>> 10 loops, best of 3: 9.2 sec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,1000))]*100000]"
>>> 10 loops, best of 3: 12.7 sec per loop
इन परीक्षण से हम यह निष्कर्ष निकाल सकते हैं कि map
इस मामले में सूची समझ से अधिक प्रदर्शन का लाभ है। यह भी लागू होता है यदि आप int
या तो कास्ट करने की कोशिश कर रहे हैं str
। प्रति सूची से कम तत्वों वाली छोटी संख्या के लिए, अंतर नगण्य है। प्रति सूची में अधिक तत्वों के साथ बड़ी सूचियों के लिए, व्यक्ति map
सूची बोध के बजाय उपयोग करना पसंद कर सकता है , लेकिन यह पूरी तरह से आवेदन की जरूरतों पर निर्भर करता है।
हालाँकि मुझे व्यक्तिगत रूप से सूची पढ़ने की क्षमता अधिक पढ़ने योग्य और मुहावरेदार लगती है map
। यह अजगर में एक वास्तविक मानक है। आमतौर पर लोग सूची की समझ का उपयोग करने में अधिक कुशल और सहज (विशेष रूप से शुरुआती) होते हैं map
।