gpt4 book ai didi

python - 快速 python 前端列表扩展

转载 作者:太空狗 更新时间:2023-10-30 00:41:33 26 4
gpt4 key购买 nike

在 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

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

最佳答案

绝对最快的方法是使用 collections.deque它针对这种用途进行了优化,并具有称为 .appendleft.extendleft 的方法,使代码美观且可读 - appendleft 正是这样做的它在 jar 上说(即,它附加到双端队列的左侧),extendleft 相当于:

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

因此,a = b+a 将拼写为:

a.extendleft(reversed(b))

关于python - 快速 python 前端列表扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11134843/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com