将字符串附加到字符串变量的最佳方法是使用+
或+=
。这是因为它可读且快速。它们的速度也一样快,您选择的是一个品味问题,后者是最常见的。以下是该timeit
模块的时间安排:
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
哎呀 即使在这种情况下,append / join也较慢。
那么,该建议来自何处?Python 2?
a += b:
0.165287017822
a.append(b):
0.0132720470428
a.join(a):
0.114929914474
好吧,如果您使用的是非常长的字符串(通常不是,那么内存中100MB的字符串会是什么),append / join的速度会稍微快一些。
但是真正的关键是Python 2.3。我什至不告诉您时间安排,因为它是如此之慢以至于还没有完成。这些测试突然耗时数分钟。除了append / join之外,它和以后的Python一样快。
对。在石器时代,字符串连接在Python中非常缓慢。但是在2.4上已经不存在了(或者至少是Python 2.4.7),因此在2008年Python 2.3停止更新时,使用append / join的建议已过时,您应该停止使用它。:-)
(更新:当我更仔细地进行测试时发现,使用+
和+=
在Python 2.3上使用两个字符串的速度也更快。关于使用的建议''.join()
一定是一种误解)
但是,这是CPython。其他实现可能还有其他问题。这是过早优化是万恶之源的又一个原因。除非先进行测量,否则不要使用被认为“更快”的技术。
因此,进行字符串连接的“最佳”版本是使用+或+ =。如果事实证明这对您来说很慢,那是不太可能的,那么请执行其他操作。
那么,为什么在我的代码中使用大量的添加/联接?因为有时它实际上更清晰。尤其是当您应将其串联在一起时,应以空格,逗号或换行符分隔。