如何有效地将一个字符串附加到另一个字符串?是否有更快的替代方案:
var1 = "foo"
var2 = "bar"
var3 = var1 + var2
要处理列表中的多个字符串,请参阅 如何将列表中的项目连接(连接)到单个字符串。
原文由 user469652 发布,翻译遵循 CC BY-SA 4.0 许可协议
如何有效地将一个字符串附加到另一个字符串?是否有更快的替代方案:
var1 = "foo"
var2 = "bar"
var3 = var1 + var2
要处理列表中的多个字符串,请参阅 如何将列表中的项目连接(连接)到单个字符串。
原文由 user469652 发布,翻译遵循 CC BY-SA 4.0 许可协议
不要过早优化。如果您没有理由相信字符串连接会导致速度瓶颈,那么只需坚持使用 +
和 +=
:
s = 'foo'
s += 'bar'
s += 'baz'
也就是说,如果您的目标是像 Java 的 StringBuilder 这样的东西,Python 的标准用法是将项目添加到列表中,然后使用 str.join
在最后将它们全部连接起来:
l = []
l.append('foo')
l.append('bar')
l.append('baz')
s = ''.join(l)
原文由 John Kugelman 发布,翻译遵循 CC BY-SA 2.5 许可协议
4 回答4.5k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
1 回答4.4k 阅读✓ 已解决
1 回答3.9k 阅读✓ 已解决
1 回答2.8k 阅读✓ 已解决
如果您只有一个对字符串的引用,并且您将另一个字符串连接到末尾,CPython 现在是特殊情况,并尝试在适当的位置扩展字符串。
最终结果是操作摊销 O(n)。
例如
以前是 O(n^2),现在是 O(n)。
从源(bytesobject.c):
凭经验验证很容易。
但重要的 是要注意这种优化不是 Python 规范的一部分。据我所知,它仅在 cPython 实现中。例如,对 pypy 或 jython 的相同经验测试可能会显示较旧的 O(n**2) 性能。
到目前为止一切顺利,但是,
哎哟甚至比二次更糟糕。所以 pypy 对短字符串效果很好,但对大字符串效果很差。