繁体   English   中英

Python 中连接字符串的最有效方法

[英]Most Efficient Method to Concatenate Strings in 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方法对于字符串拼接来说是最快的。 感谢所有的答案!

对于两个字符串ab ,只需使用a + b 替代方法是连接两个以上的字符串,避免每次使用+时创建的临时str object ,以及由于在下一个结果中重复复制先前操作的内容而导致的二次行为。

(还有f'{a}{b}' ,但它在语法上更重,并且不比a + b快。)

你为什么不试试看? 您可以使用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 秒的速度提升。

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

from datetime import datetime
a = "start"
b = " end"

start = datetime.now()
print(a+b)
print(datetime.now() - start)

start = datetime.now()
print("".join((a, b)))
print(datetime.now() - start)

start = datetime.now()
print('{0}{1}'.format(a, b))
print(datetime.now() - start)

# Output
# start end
# 0:00:00.000056
# start end
# 0:00:00.000014
# start end
# 0:00:00.000014

看起来 .join() 和 .format() 基本相同,速度快了 4 倍。 一个 F 字符串,例如:

print(f'{a} {b}')

也是一种非常快速和干净的方法,尤其是在处理更复杂的格式时。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM