2012-06-21 47 views
5

擴展python中數組前端的最快方法是什麼?可以說我有兩個數組: a和b。我想讓a = b + a(b不應該改變)的最快方式。快速擴展Python前端列表

我的小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.5秒〜

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.4秒

但我認爲它應該會更快,因爲列表串聯應當進行儘可能少的根本指針的變化。 而下面的代碼是最快的國家之一,但改變了B,不是(這樣不利於我們的宗旨): 測試「錯誤」:

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

所以理論上應該有一種方法來延長測試「錯誤」的時間。

+5

'從集合IM port deque' – eumiro

+1

請注意,你有什麼是列表,而不是數組。 –

回答

10

絕對最快的方法是使用它正是這種使用優化的collections.deque,並已方法稱爲.appendleft.extendleft使代碼漂亮和可讀 - appendleft不正是它在錫說(即,它追加到雙端隊列)的左側,extendleft不等價的:

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

所以,a = b+a會拼寫:

a.extendleft(reversed(b)) 
+0

您想使用'a.extendleft(反向(b))',因爲''extendleft'從頭部消耗給定的迭代(就像一隻吃老鼠的蛇)。 – eumiro

+0

@eumiro謝謝;我在我的答案中解決了這個問題。 – lvc