python - 为什么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 万条消息的连接。
我想知道为什么第二种方法比第一种方法快得多?
解决方案
a + b + c
不是将 、 和 连接成单个字符串的a
单个b
操作c
。是两次操作,t = a + b
和t + c
,意思是复制a
两次的内容;一次复制a
到t
中,然后再次t
复制到 的结果中t + c
。由于在您的示例a
中,字符串会越来越长,因此您最多只能将每一步复制的数据量加倍。
最好的方法是避免由创建的所有临时 str 对象+
,并使用join
:
total_str = "\n".join(messages)
join
直接对每个字符串进行操作,而无需一次一个地迭代地将它们附加到初始空字符串。join
通过扫描计算出messages
生成的字符串需要多长时间,为其分配足够的内存,然后依次将数据从每个元素复制messages
到一个位置。
推荐阅读
- slickgrid - 每行数据的 Angular slickgrid 动态编辑器集合
- c# - 在 HttpRequestMessage 查询参数中传递 []
- google-cloud-platform - 获取 Google Cloud 中的公共 VM 映像列表
- node.js - Webpack JS API:输出到本地变量而不是创建 bundle.js 文件
- processing - 处理 Kinect (v2) 图像中间的奇怪点
- python - 我可以将值(Python文件将不断更新此值)连续写入json文件吗?
- javascript - 如何从 Cheerio/jQuery 中的源标签中检索链接
- vb.net - 在 VB.Net 中重载关键字
- javascript - 如何将对象的值转换为自变量
- google-apps-script - 无法从 Google 表格打开脚本编辑器;只登录一个帐户