2012-07-14 6 views
7

मैं पाइथन 3.2.3 का उपयोग कर रहा हूं। रिवर्स में एक सूची में फिर से शुरू करने का सबसे तेज़ तरीका क्या है? [:: - 1], उलट, list.reverse() या शायद कुछ और तरीका? मैं लगभग 5e6 तत्वों की सूची से निपट रहा हूं, इसलिए मुझे सूची की प्रतिलिपि बनाने से बचने की ज़रूरत है।जितनी जल्दी संभव हो सके पाइथन सूची में पुन: प्रयास करने की आवश्यकता

+3

आपको इसे स्वयं परीक्षण करना चाहिए। मैं आपको ['timeit' मॉड्यूल] (http://docs.python.org/library/timeit.html) की जांच करने की सलाह देता हूं। –

उत्तर

13
>>> from timeit import Timer 
>>> t = Timer('[x for x in l[::-1]]', 'l = list(range(100000))') 
>>> t.timeit(number=1000) 
5.549649953842163 
>>> t = Timer('l.reverse(); [x for x in l]', 'l = list(range(100000))') 
>>> t.timeit(number=1000) 
4.548457145690918 
>>> t = Timer('[x for x in reversed(l)]', 'l = list(range(100000))') 
>>> t.timeit(number=1000) 
4.428632974624634 

निष्कर्ष: उलट() 100000 वस्तुओं के साथ सूची में l.reverse() से थोड़ा तेज है। यह निश्चित रूप से और भी सत्य है यदि आप वास्तव में पूरी सूची में लूप नहीं करते हैं, और यदि आप एक से अधिक बार सूची का उपयोग करते हैं तो यह सत्य होने पर रोकता है।

l[::-1] 2.4 से पुराना है जो reversed() पेश किया गया है।

13

reversed सबसे अच्छा होना चाहिए क्योंकि यह एक इटरेटर लौटाता है, इसलिए यह सूची की प्रतिलिपि नहीं करता है, केवल एक ही समय में एक तत्व उत्पन्न करता है। (list.reverse() भी सूची की कॉपी नहीं होगी, लेकिन यह यह उत्परिवर्तित जाएगा, ताकि सूची पीछे की ओर के बाद आपका काम हो गया हो जाएगा, reversed जबकि मूल सूची संशोधित नहीं करता है।)

+1

ध्यान दें कि iterators * जरूरी नहीं है * प्रतिलिपि रोकें, यह इस मामले में काम करने के लिए होता है। –

+1

यह सच है, लेकिन आम तौर पर बिल्ट-इन पायथन फ़ंक्शन जो इटरेटर प्रदान करते हैं, पूरी सूची को एक साथ नहीं बनाते हैं; यह उनका पूरा बिंदु है। – BrenBarn

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