<p>将字符串附加到字符串变量的最佳方式是使用<code>+</code>或<code>+=</code>。这是因为它可读性和速度。他们也一样快,你选择哪一个是口味的问题,后一个是最常见的。以下是<code>timeit</code>模块的计时:</p>
<pre><code>a = a + b:
0.11338996887207031
a += b:
0.11040496826171875
</code></pre>
<p>但是,那些建议有列表并附加到列表中,然后加入这些列表的人这样做是因为将字符串附加到列表中可能比扩展字符串要快得多。在某些情况下,这是真的。例如,这里有一个
一百万个一个字符串的追加,首先是一个字符串,然后是一个列表:</p>
<pre><code>a += b:
0.10780501365661621
a.append(b):
0.1123361587524414
</code></pre>
<p>好吧,事实证明,即使结果字符串有一百万个字符长,追加也更快。</p>
<p>现在,让我们尝试将1000个字符长的字符串追加十万次:</p>
<pre><code>a += b:
0.41823482513427734
a.append(b):
0.010656118392944336
</code></pre>
<p>因此,结束字符串的长度约为100MB。那是相当缓慢的,添加到列表中要快得多。这个时间不包括最后的<code>a.join()</code>。那要多长时间?</p>
<pre><code>a.join(a):
0.43739795684814453
</code></pre>
<p>欧普斯。即使在这种情况下,append/join也比较慢。</p>
<p>那么,这个建议是从哪里来的呢?Python2?</p>
<pre><code>a += b:
0.165287017822
a.append(b):
0.0132720470428
a.join(a):
0.114929914474
</code></pre>
<p>好吧,如果您使用非常长的字符串(通常不是这样的,您会有一个内存为100MB的字符串),那么append/join的速度会略快一些</p>
<p>但真正的关键是Python 2.3。我甚至不给你看时间,因为太慢了,还没结束。这些测试突然需要<em>分钟</em>。除了append/join,它和后面的Pythons一样快。</p>
<p>是的。在石器时代的Python中,字符串连接非常慢。但是在2.4版本中,它已经不再是(或者至少是Python2.4.7),所以使用append/join的建议在2008年就过时了,当时Python2.3停止更新,您应该停止使用它。:-)</p>
<p><em>(更新:当我更仔细地进行测试时发现,对于Python 2.3上的两个字符串,使用<code>+</code>和<code>+=</code>也更快。使用<code>''.join()</code>的建议一定是个误会)</em></p>
<p>不过,这是CPython。其他实现可能有其他问题。这也是为什么过早优化是万恶之源的另一个原因。除非你先测量一下,否则不要使用所谓的“更快”的技术。</p>
<p><strong>因此,进行字符串连接的“最佳”版本是使用+或+=</strong>。如果这对你来说很慢,这是不太可能的,那就做点别的。</p>
<p>那么,为什么在代码中要使用大量的append/join呢?因为有时候会更清楚。尤其是当您应该连接在一起的内容应该用空格、逗号或换行符分隔时。</p>