首页 > 解决方案 > 为什么python中字符串连接的顺序对速度影响很大?

问题描述

我刚刚通过调试我的代码发现了这个问题。我有一个消息列表作为字符串,我试图将它们连接在一起,我想在每条消息的末尾添加一个换行符。

方法一:

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 万条消息的连接。

我想知道为什么第二种方法比第一种方法快得多?

标签: pythonstringperformance

解决方案


a + b + c不是将 、 和 连接成单个字符串的a单个b操作c。是两次操作,t = a + bt + c,意思是复制a 两次的内容;一次复制at中,然后再次t复制到 的结果中t + c。由于在您的示例a中,字符串会越来越长,因此您最多只能将每一步复制的数据量加倍。

最好的方法是避免由创建的所有临时 str 对象+,并使用join

total_str = "\n".join(messages)

join直接对每个字符串进行操作,而无需一次一个地迭代地将它们附加到初始空字符串。join通过扫描计算出messages生成的字符串需要多长时间,为其分配足够的内存,然后依次将数据从每个元素复制messages到一个位置。


推荐阅读