让我们假设你有这个代码从三个字符串构建一个字符串:
x = 'foo'
x += 'bar' # 'foobar'
x += 'baz' # 'foobarbaz'
在这种情况下,Python首先需要分配和创建’foobar’,然后才能分配和创建’foobarbaz’。
所以对于每个被调用的,字符串的整个内容和被添加到它的任何内容需要被复制到一个全新的内存缓冲区。换句话说,如果你有N个字符串要被连接,你需要分配大约N个临时字符串,第一个子字符串被复制〜N次。最后一个子字符串只被复制一次,但平均来说,每个子字符串被复制〜N / 2次。
使用.join,Python可以发挥一些技巧,因为中间字符串不需要创建。 CPython计算出它需要多少内存,然后分配一个正确大小的缓冲区。最后,它然后将每个片段复制到新的缓冲器中,这意味着每个片段仅被复制一次。
在某些情况下,还有其他可行的方法可以导致更好的性能。例如。如果内部字符串表示实际上是一个rope或者如果运行时实际上足够聪明,以某种方式弄清楚临时字符串是没有用的程序和优化他们。
然而,CPython当然不能可靠地进行这些优化(虽然它可能适用于few corner cases),并且由于它是最常用的实现,许多最佳实践都是基于对CPython有效的。具有标准化规范集合还使得其他实现方式更容易集中其优化努力。