在python 3中加速列表连接[重复]

Posted

技术标签:

【中文标题】在python 3中加速列表连接[重复]【英文标题】:Accelerating list concatenation in python 3 [duplicate] 【发布时间】: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)),应该是最快的 【参考方案1】:

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

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

一种奇特的方法

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

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

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

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

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

【讨论】:

以上是关于在python 3中加速列表连接[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中使用 + 和 += 运算符进行连接 [重复]

从mysql连接两个表并在一个JSP列表中显示信息[重复]

Python连接列表[重复]

获取连接表ID匹配或是ID列表子集的记录[重复]

Apache Spark将多行连接成单行列表[重复]

试图将 3 个列表中的元素组合(连接)为一个新列表 [重复]