【发布时间】:2018-11-19 13:22:28
【问题描述】:
我刚刚通过调试我的代码发现了这个问题。我有一个消息列表作为字符串,我试图将它们连接在一起,我想在每条消息的末尾添加一个换行符。
方法一:
total_str = ""
for m in messages:
total_str = total_str + m + "\n"
这非常慢 - 在大约第 100,000 条消息之后,添加每条消息大约需要 2-3 秒,而在第 300,000 条消息左右,这个过程基本停止了。
方法二:
total_str = ""
for m in messages:
tmp = m + "\n"
total_str = total_str + tmp
这种方法在不到一秒的时间内完成了所有 160 万条消息的连接。
我想知道为什么第二种方法比第一种方法快得多?
【问题讨论】:
-
奖励:
total_str += m + '\n'也比方法 #1 快。 -
您的实现正遭受与在这样的 for 循环中连接不可变字符串相关的性能问题;行为是多项式时间。但是,我怀疑 CPython 运行时中的窥孔优化器能够使用临时变量优化版本。这是一个不应该依赖的实现细节。使用
messages.append("")然后'\n'.join(messages) -
@juanpa.arrivillaga 我不认为这是一种优化。我认为恰恰相反。 CPython 愚蠢到将
a + b + c执行为(a + b) + c,这导致长字符串a被复制两次。 (而a + (b + c)只会复制一次)
标签: python string performance