这是对该问题的后续跟踪
因此,首先,您会注意到无法sum对要连接的字符串列表执行,python告诉您改为使用str.join,这是个好建议,因为无论您如何+在字符串上使用,性能都很差。
sum
str.join
+
“不能使用sum”限制不适用于list,尽管这itertools.chain.from_iterable是执行这种列表平整的首选方法。
list
itertools.chain.from_iterable
但是sum(x,[])什么时候x是列表绝对是不好的。
sum(x,[])
x
但是它应该保持这种状态吗?
我比较了三种方法
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()
itertools.chain
所以,sum是远远落后,因为它执行result = result + b的,而不是result += b
result = result + b
result += b
所以现在我的问题是:
sum如果可用,为什么不能使用这种累积方法?
(这对于已经存在的应用程序将是透明的,并使使用sum内置函数有效地展平列表成为可能)
我们可以尝试使 sum() 更智能,但Alex Martelli和Guido van Rossum希望将其重点放在算术求和上。
FWIW,您应该使用以下简单代码获得合理的性能:
result = [] for seq in mylists: result += seq
对于您的另一个问题,“为什么总不能使用这种累加方法?”,请参见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. */