Jea*_*bre 6 python performance sum list
这是莫名其妙的后续这个问题
首先,你会注意到你不能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)
Run Code Online (Sandbox Code Playgroud)
结果:
sum()在列表中:10.46647310256958.好的,我们知道.itertools.chain:0.07705187797546387itertools.chain您看到的更快)所以sum落后了,因为它result = result + b代替了result += b
所以现在我的问题是:
为什么不能sum在可用时使用这种累积方法?
(这对于现有的应用程序来说是透明的,并且可以使用sum内置的内容来有效地压缩列表)
我们可以尝试使sum()变得更聪明,但Alex Martelli和Guido van Rossum希望将其专注于算术总结.
FWIW,你应该用这个简单的代码获得合理的性能:
result = []
for seq in mylists:
result += seq
Run Code Online (Sandbox Code Playgroud)
对于你的另一个问题,"为什么不能在可用的时候使用这种累积方法?",请参阅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. */
Run Code Online (Sandbox Code Playgroud)