在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) 绝对是更好的代码,我没想到。不过似乎仍然很慢。 Nosum
不是更好的代码。使用.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中加速列表连接[重复]的主要内容,如果未能解决你的问题,请参考以下文章