5

在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.5s

测试3:

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

所以理论上应该有一种方法可以在测试“错误”的时候延长前面的时间。

4

1 回答 1

10

绝对最快的方法是使用collections.deque针对这种用途进行了优化的 a ,并且具有调用的方法.appendleft并使.extendleft代码变得美观和可读 -appendleft完全按照它在锡上所说的那样做(即,它附加到双端队列的左侧) , 并且extendleft相当于:

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

所以,a = b+a将被拼写:

a.extendleft(reversed(b))
于 2012-06-21T09:06:55.343 回答