The best将字符串附加到字符串变量的方法是使用+
or +=
。这是因为它可读且速度快。它们也同样快,您选择哪一种取决于口味,后一种是最常见的。以下是与timeit
module:
a = a + b:
0.11338996887207031
a += b:
0.11040496826171875
然而,那些建议使用列表并附加到列表中然后加入这些列表的人会这样做,因为与扩展字符串相比,将字符串附加到列表可能非常快。在某些情况下,这可能是真的。例如,这里有一个
一百万次追加一个单字符字符串,首先追加到一个字符串,然后追加到一个列表:
a += b:
0.10780501365661621
a.append(b):
0.1123361587524414
好吧,事实证明,即使生成的字符串有一百万个字符长,附加仍然更快。
现在让我们尝试附加一千个字符的长字符串十万次:
a += b:
0.41823482513427734
a.append(b):
0.010656118392944336
因此,最终字符串的长度约为 100MB。这相当慢,附加到列表要快得多。该时间不包括决赛a.join()
。那么这需要多长时间?
a.join(a):
0.43739795684814453
哎呀。事实证明,即使在这种情况下,追加/连接速度也较慢。
那么这个推荐从何而来呢? Python 2?
a += b:
0.165287017822
a.append(b):
0.0132720470428
a.join(a):
0.114929914474
嗯,追加/连接是边际地如果你使用极长的字符串(通常不会,那么你会拥有一个内存为 100MB 的字符串吗?)
但真正的关键是 Python 2.3。我什至不会告诉你时间,因为它太慢了,还没有完成。这些测试突然发生minutes。除了追加/连接之外,它与后来的 Python 一样快。
是的。在石器时代,Python 中的字符串连接速度非常慢。但在 2.4 上它不再存在了(或者至少是 Python 2.4.7),因此使用追加/连接的建议在 2008 年就已经过时了,当时 Python 2.3 停止更新,你应该停止使用它。 :-)
(更新:事实证明,当我更仔细地进行测试时,使用+
and +=
在 Python 2.3 上对于两个字符串也更快。使用建议''.join()
一定是误会)
然而,这是CPython。其他实现可能有其他问题。这也是过早优化成为万恶之源的另一个原因。除非您首先测量它,否则不要使用被认为“更快”的技术。
因此,进行字符串连接的“最佳”版本是使用 + 或 +=。如果这对你来说很慢(这不太可能),那么就做其他事情。
那么为什么我在代码中使用大量追加/连接呢?因为有时它实际上更清楚。特别是当您应该连接在一起的任何内容都应该用空格、逗号或换行符分隔时。