小编典典

总的来说可以更快

python

这是对该问题的后续跟踪

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

“不能使用sum”限制不适用于list,尽管这itertools.chain.from_iterable是执行这种列表平整的首选方法。

但是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()在清单清单上:10.46647310256958。好吧,我们知道。
  • itertools.chain:0.07705187797546387
  • 使用就地加法的自定义累积总和:0.057044029235839844(可能比itertools.chain您看到的快)

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

所以现在我的问题是:

sum如果可用,为什么不能使用这种累积方法?

(这对于已经存在的应用程序将是透明的,并使使用sum内置函数有效地展平列表成为可能)


阅读 133

收藏
2020-12-20

共1个答案

小编典典

我们可以尝试使 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. */
2020-12-20