python - 在 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
方法是最快的字符串连接。感谢所有的答案!
解决方案
你为什么不试试看?您可以使用timeit.timeit()多次运行语句并返回总持续时间。
在这里,我们使用s
设置变量a
和b
(不包括在整体时间中),然后运行各种选项 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 秒的速度提升。
请注意,根据您要连接的字符串的长度(和数量)以及您正在运行的硬件,您的结果可能会有很大差异。
推荐阅读
- sqlite - SQL 数据库加密
- html - 重新设置样式使其无用
- r - 运行决策树时 RStudio 出错(mac)
- c# - 如何在 xamarin 表单中显示条目警报
- c++ - 我有一个游戏的主要内容,我正在尝试使用 .go() 方法
- c# - 如何修复 MissingReferenceException 告诉我游戏对象在我没有销毁时已被销毁?
- c# - 从 html 字符串中获取 html 输入控件及其值
- javascript - 跨浏览器区分右键单击和上下文菜单键
- java - Java DecimalFormat 瑞典语区域设置“se_SV”负数格式
- r - 匿名化 R 中每个不同行的数据