【问题标题】:Accelerating list concatenation in python 3 [duplicate]在python 3中加速列表连接[重复]
【发布时间】:2019-04-05 23:46:42
【问题描述】:

我正在运行以下代码:

x = []
for i in c:
    x = x+i

结果有大约 50-1 亿个元素。

这需要几分钟才能在我的 PC 上运行。我怎样才能加快这个速度?

【问题讨论】:

  • sum(c) 绝对是更好的代码,我没想到。不过似乎仍然很慢。
  • No sum 不是更好的代码。使用.extend 在一个循环中连接,这将具有非对称的恒定时间行为而不是二次行为。或者使用+=(调用extend)。只是简单的列表连接,+ 是 O(A+B),所以要连接一堆小列表,这会在最终列表的大小上产生二次时间复杂度。取而代之的是,extend 是 O(B),其中 B 是较小列表的大小,因此在最终列表的大小上是 O(N)。
  • @cjm2671,请提供一个minimal reproducible example
  • @PMende 他们在做同样的事情。 += 只是更快,因为解释器不必解析 c.extend,属性访问很慢,+= 将缩短它
  • @cjm2671 试试list(chain.from_iterable(c)),应该是最快的

标签: python python-3.x list


【解决方案1】:

已经在join list of lists in python进行比较

Python 2 使用 .extend 比使用 itertools.chain 更快

一种奇特的方法

l = [] 
for x in c: l[0:0] = x 

其中较快的根据 stackoverflow.com/questions/12088089/…

对于 python 3.5 及更高版本,更加奇特

l = [] 
for x in c: 
    l = [l, *x]

当然 sum(c, []) 在所有测量中都是最差的。

【讨论】:

    猜你喜欢
    • 2017-08-02
    • 1970-01-01
    • 2013-06-13
    • 2011-03-02
    • 2015-09-24
    • 2021-09-08
    • 2014-02-04
    • 2019-12-09
    • 2013-05-07
    相关资源
    最近更新 更多