2012-08-16 14 views
11

संभव डुप्लिकेट:
Only index needed: enumerate or (x)range?रेंज (लेन (सूची)) या गणना (सूची)?

इनमें से कौन सा विचार किया जाएगा बेहतर/साफ/तेजी से/अधिक 'pythonic'? मुझे सूची L की सामग्री की परवाह नहीं है, यह कितना समय है।

a = [f(n) for n, _ in enumerate(L)] 

या

a = [f(n) for n in range(len(L))] 

यदि यह किसी भी फर्क नहीं पड़ता, समारोह f रूप में अच्छी तरह len(list) का उपयोग करता है।

+0

आप किस अजगर का उपयोग कर रहे हैं? –

+0

@InbarRose - 2.7 –

उत्तर

18

कुछ त्वरित समय रन enumerate() से अधिक range() एक मामूली बढ़त का उपयोग कर 2 विकल्प देने के लिए लग रहे हैं:

timeit a = [f(n) for n, _ in enumerate(mlist)] 
10000 loops, best of 3: 118 us per loop 

timeit a = [f(n) for n in range(len(mlist))] 
10000 loops, best of 3: 102 us per loop 

और सिर्फ मनोरंजन के xrange() (अजगर v2.7.2) का उपयोग कर के लिए

timeit a = [f(n) for n in xrange(len(mlist))] 
10000 loops, best of 3: 99 us per loop 

मैं करूंगा पठनीय कोड पहले का उपयोग करें, फिर उपलब्ध होने पर xrange() का उपयोग करें (यानी, प्री-पायथन वी 3.x), range() औरके बाद 210।

+0

एन्यूमेरेट तेज़ है जब आप बार-बार अपनी अनुक्रमणिका में सूची आइटम तक पहुंचना चाहते हैं। जब आप सिर्फ सूचकांक की एक सूची चाहते हैं, तो लेन() और श्रेणी/xrange का उपयोग करना तेज़ है। –

4

(x) रेंज समाधान तेज है, क्योंकि इसमें कम ओवरहेड है, इसलिए मैं इसका उपयोग करूंगा।

पायथन 2.x में, xrange का उपयोग range के बजाय करें, क्योंकि xrange कम स्मृति का उपयोग करता है, क्योंकि यह अस्थायी सूची नहीं बनाता है। पायथन 3.x में, केवल range है, जो कम स्मृति संस्करण है।

+0

क्या एक जनरेटर ऑब्जेक्ट 'xrange' है? [प्रलेखन] (http://docs.python.org/library/functions.html#xrange) उस शब्द का कोई उल्लेख नहीं करता है, हालांकि आपका वर्णन ऐसा लगता है। –

+2

यह जनरेटर ऑब्जेक्ट नहीं है (यानी उसके शरीर में 'उपज' के साथ शुद्ध पायथन कोड), लेकिन इसके बराबर है, सी में लागू किया गया है। इसमें '.next()' विधि है जो अगला मान देता है या स्टॉपइटरेशन बढ़ाता है, और 'for' लूप इस' .xt() 'विधि को बार-बार कॉल करता है। (यदि आप इसे उपयोगी पाते हैं तो कृपया मेरे उत्तर को वोट दें।) – pts

0

मैं कहूंगा कि चूंकि आप enumarate फ़ंक्शन से "_" विशेषता का उपयोग नहीं कर रहे हैं, तो रेंज का उपयोग करें क्योंकि यह उस तरह से अधिक पठनीय है।

1

मान लें कि आप पाइथन 2.x का उपयोग कर रहे हैं, यदि आप len() का उपयोग करते हैं, तो आपको xrange() का उपयोग करना चाहिए क्योंकि यह सीमा में संख्याओं की एक सूची बनाने से बच जाएगा।

और इस मामले में, मैं len() के साथ जाऊंगा क्योंकि आप इंडेक्स का उपयोग कर रहे हैं, सूची में आइटम नहीं।

संबंधित मुद्दे