快速python前端列表扩展

时间:2012-06-21 09:03:25

标签: python performance list profiling concatenation

在python中扩展数组前端的最快方法是什么?可以说我有2个阵列: a和b。我想以a = b + a(b不应该改变)的最快方式。

我的小标记:

测试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.4s

但我认为它应该更快,因为列表连接应该作为少数底层指针的变化。 以下代码是最快的代码,但是更改b,而不是a(因此我们的目的并不好): 测试“错误”:

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

因此理论上应该有一种方法可以延长测试时间“错误”。

1 个答案:

答案 0 :(得分:10)

绝对最快的方法是使用针对此用途进行了优化的collections.deque,并使用名为.appendleft.extendleft的方法来使代码更好且可读 - {{ 1}}完全按照它在锡上所说的那样(即,它附加在双端队列的左侧),而appendleft则相当于:

extendleft

所以,def extendleft(self, other) for item in other: self.appendleft(c) 将拼写:

a = b+a