在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
因此理论上应该有一种方法可以延长测试时间“错误”。
答案 0 :(得分:10)
绝对最快的方法是使用针对此用途进行了优化的collections.deque
,并使用名为.appendleft
和.extendleft
的方法来使代码更好且可读 - {{ 1}}完全按照它在锡上所说的那样(即,它附加在双端队列的左侧),而appendleft
则相当于:
extendleft
所以,def extendleft(self, other)
for item in other:
self.appendleft(c)
将拼写:
a = b+a