首页 > 解决方案 > 在 Python 中连接字符串的最有效方法

问题描述

在提出这个问题时,我使用的是Python 3.8

当我说高效时,我只是指连接字符串的速度,或者用更专业的术语来说:我问的是时间复杂度,而不是空间复杂度。

鉴于以下情况,我目前唯一能想到的方法是以下 3 种:

a = 'start'
b = ' end'

方法一

result = a + b

方法二

result = ''.join((a, b))

方法三

result = '{0}{1}'.format(a, b)

我想知道这些方法中哪个更快,或者是否有其他更有效的方法。此外,如果您知道这些方法中的任何一种对于更多字符串或更长字符串的执行方式是否不同,请在您的答案中包括这一点。

编辑

在看到所有的评论和答案之后,我学习了一些连接字符串的新方法,并且我还了解了timeit库。我将在下面报告我的个人发现:

>>> import timeit

>>> print(timeit.Timer('result = a + b', setup='a = "start"; b = " end"').timeit(number=10000))
0.0005306000000473432

>>> print(timeit.Timer('result = "".join((a, b))', setup='a = "start"; b = " end"').timeit(number=10000))
0.0011297000000354274

>>> print(timeit.Timer('result = "{0}{1}".format(a, b)', setup='a = "start"; b = " end"').timeit(number=10000))
0.002327799999989111

>>> print(timeit.Timer('result = f"{a}{b}"', setup='a = "start"; b = " end"').timeit(number=10000))
0.0005772000000092703

>>> print(timeit.Timer('result = "%s%s" % (a, b)', setup='a = "start"; b = " end"').timeit(number=10000))
0.0017815999999584164

看来对于这些小字符串,传统的a + b方法是最快的字符串连接。感谢所有的答案!

标签: pythonstringperformance

解决方案


你为什么不试试看?您可以使用timeit.timeit()多次运行语句并返回总持续时间。

在这里,我们使用s设置变量ab(不包括在整体时间中),然后运行各种选项 1000 万次。

>>> from timeit import timeit
>>>
>>> n = 10 * 1000 * 1000
>>> s = "a = 'start'; b = ' end'"
>>>
>>> timeit("c = a + b",                 setup=s, number=n)
0.4452877212315798
>>>
>>> timeit("c = f'{a}{b}'",             setup=s, number=n)
0.5252049304544926
>>>
>>> timeit("c = '%s%s'.format(a, b)",   setup=s, number=n)
0.6849184390157461
>>>>
>>> timeit("c = ''.join((a, b))",       setup=s, number=n)
0.8546998891979456
>>>
>>> timeit("c = '%s%s' % (a, b)",       setup=s, number=n)
1.1699129864573479
>>>
>>> timeit("c = '{0}{1}'.format(a, b)", setup=s, number=n)
1.5954962372779846

这表明除非您的应用程序的瓶颈是字符串连接,否则可能不值得太担心......

  • 最好的情况是 1000 万次迭代约 0.45 秒,或每次操作约 45ns。
  • 最坏的情况是 1000 万次迭代约 1.59 秒,或每次操作约 159ns。

如果您正在执行数百万次操作,您将看到大约 1 秒的速度提升。

请注意,根据您要连接的字符串的长度(和数量)以及您正在运行的硬件,您的结果可能会有很大差异。


推荐阅读