2012-06-21 11 views
5

पाइथन में सरणी के सामने विस्तार करने का सबसे तेज़ तरीका क्या है? आइए कहें कि मेरे पास 2 एरे हैं: ए और बी। मैं एक = बी + ए (बी नहीं बदलना चाहिए) का सबसे तेज़ तरीका बनाना चाहता हूं।फास्ट पायथन फ्रंट सूची

मेरे छोटे benchamarks:

परीक्षण 1:

a,b = [],[] 
for i in range(0,100000): 
    a.append(i) 
    b.append(i) 

def f(a,b): 
    for i in range(0,100): 
     a=a+b 

import cProfile 
cProfile.run('f(a,b)') 

समय: ~ 12 रों

परीक्षण 2:

a,b = [],[] 
for i in range(0,100000): 
    a.append(i) 
    b.append(i) 

def f(a,b): 
    for i in range(0,100): 
     a[0:0] = b 

import cProfile 
cProfile.run('f(a,b)') 

समय: ~ 1.5s

test3:

a,b = [],[] 
for i in range(0,100000): 
    a.append(i) 
    b.append(i) 

lenb = len(b) 
def f(a,b): 
    for i in range(0,100): 
     b.extend(a) 
     # do something with b 
     b = b[:lenb] 

import cProfile 
cProfile.run('f(a,b)') 

समय: ~ 0.4s

लेकिन मुझे लगता है कि यह तेजी से होना चाहिए क्योंकि सूचियों संयोजन कुछ अंतर्निहित संकेत के परिवर्तन के रूप में किया जाना चाहिए। और निम्नलिखित कोड सबसे तेजी से एक है, लेकिन ख बदल जाता है, नहीं एक (अतः यह अच्छा नहीं हमारे उद्देश्य के लिए है): परीक्षण "गलत":

a,b = [],[] 
for i in range(0,100000): 
    a.append(i) 
    b.append(i) 

def f(a,b): 
    for i in range(0,100): 
     b.extend(a) 

import cProfile 
cProfile.run('f(a,b)') 

समय: ~ 0.13s

तो सैद्धांतिक रूप से परीक्षण "WRONG" के समय के सामने विस्तार करने का एक तरीका होना चाहिए।

+5

'im संग्रह से पोर्ट डेक ' – eumiro

+1

नोट, आपके पास सूचियां हैं, सरणी नहीं। –

उत्तर

10

निरपेक्ष सबसे तेज़ तरीका एक collections.deque जो वास्तव में इस प्रयोग के लिए अनुकूलित है उपयोग करने के लिए होगा, और .appendleft और .extendleft का आह्वान किया है तरीकों कोड अच्छा बनाने के लिए और पठनीय - appendleft क्या यह टिन पर कहते हैं (वास्तव में करता है यानी, यह Deque का) बाईं ओर जोड़ देती है, और extendleft के बराबर करता है:

def extendleft(self, other) 
    for item in other: 
     self.appendleft(c) 
तो

, a = b+a वर्तनी की जाएगी:

a.extendleft(reversed(b)) 
+0

आप 'a.extendleft (उपयोग (बी)) का उपयोग करना चाहते हैं, क्योंकि' विस्तारित 'अपने सिर से दिए गए अस्थिर (जैसे माउस को सांप की तरह) का उपभोग करता है। – eumiro

+0

@ यूमिरो धन्यवाद; मैंने अपने जवाब में यह तय कर लिया है। – lvc

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