将字符串附加到字符串变量的最佳+
方法是使用or +=
。这是因为它可读且快速。它们也一样快,您选择哪一种是口味问题,后者是最常见的。以下是该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
哎呀。事实证明,即使在这种情况下,追加/加入也更慢。
那么这个推荐是从哪里来的呢?蟒蛇2?
a += b:
0.165287017822
a.append(b):
0.0132720470428
a.join(a):
0.114929914474
好吧,如果您使用极长的字符串(通常不是,那么在内存中会有 100MB 的字符串,追加/连接会稍微快一些吗?)
但真正的关键是 Python 2.3。我什至不会告诉你时间,因为它太慢了,它还没有完成。这些测试突然需要几分钟。除了追加/连接,它和后来的 Python 一样快。
是的。在石器时代,Python 中的字符串连接非常缓慢。但是在 2.4 上它不再是(或者至少是 Python 2.4.7),所以使用 append/join 的建议在 2008 年已经过时了,当时 Python 2.3 停止更新,你应该停止使用它。:-)
(更新:事实证明,当我在 Python 2.3 上更仔细地进行测试时,使用+
并且+=
对于两个字符串也更快。使用的建议''.join()
一定是一个误解)
但是,这是 CPython。其他实现可能有其他问题。这只是过早优化是万恶之源的另一个原因。除非您首先测量它,否则不要使用所谓的“更快”的技术。
因此,进行字符串连接的“最佳”版本是使用 + 或 +=。如果这对你来说很慢,这不太可能,然后做其他事情。
那么为什么我在我的代码中使用大量的附加/连接呢?因为有时它实际上更清楚。特别是当你应该连接在一起的任何东西都应该用空格、逗号或换行符分隔时。