gpt4 book ai didi

python - 列表上的总和可能更快

转载 作者:太空狗 更新时间:2023-10-29 22:24:59 25 4
gpt4 key购买 nike

这在某种程度上是 question 的后续行动

首先,您会注意到您不能对字符串列表执行 sum 来连接它们,python 告诉您改用 str.join,并且这是个好建议,因为无论您如何在字符串上使用 +,性能都很差。

“不能使用 sum”限制不适用于 list,不过,itertools.chain.from_iterable 是首选方式执行这样的列表展平。

但是 sum(x,[])x 是列表的列表时绝对是错误的。

但它应该保持这种状态吗?

我比较了 3 种方法

import time
import itertools

a = [list(range(1,1000)) for _ in range(1000)]

start=time.time()
sum(a,[])
print(time.time()-start)

start=time.time()
list(itertools.chain.from_iterable(a))
print(time.time()-start)


start=time.time()
z=[]
for s in a:
z += s
print(time.time()-start)

结果:

  • sum() 在列表列表中:10.46647310256958。好吧,我们知道了。
  • itertools.chain:0.07705187797546387
  • 使用就地加法的自定义累加和:0.057044029235839844(如您所见,可以比 itertools.chain 更快)

所以 sum 远远落后,因为它执行 result = result + b 而不是 result += b

那么现在我的问题是:

为什么 sum 不能在可用时使用这种累加方法?

(这对于已经存在的应用程序来说是透明的,并且可以使用内置的 sum 来有效地展平列表)

最佳答案

我们可以尝试让 sum() 更聪明,但 Alex Martelli 和 Guido van Rossum 希望让它专注于算术求和。

FWIW,您应该使用这段简单的代码获得合理的性能:

result = []
for seq in mylists:
result += seq

对于您的其他问题,“为什么 sum 可用时不能使用这种累积方法?”,请参阅 Python/bltinmodule.c 中 builtin_sum() 的评论:

    /* It's tempting to use PyNumber_InPlaceAdd instead of
PyNumber_Add here, to avoid quadratic running time
when doing 'sum(list_of_lists, [])'. However, this
would produce a change in behaviour: a snippet like

empty = []
sum([[x] for x in range(10)], empty)

would change the value of empty. */

关于python - 列表上的总和可能更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42593904/

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