在Python中最有效的串联方法

问题描述 投票:1回答:1

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

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

鉴于此,我目前能想到的方法只有以下3种。

a = 'start'
b = ' end'

方法一

result = a + b

方法二

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

方法三

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

我想知道这些方法中哪种更快,或者是否有其他更有效的方法。此外,如果你知道这些方法中的任何一种方法在使用更多字符串或更长的字符串时是否有不同的表现,请在你的答案中包括这一点。

编辑

看了大家的评论和回答,我学会了几种新的串联方法,也了解了一下关于 时机 图书馆。下面我将报告我个人的发现。

>>> 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 方法是最快的字符串连接。谢谢大家的回答!

python string performance
1个回答
3
投票

你为什么不试一试呢?你可以用 时光网.时光网() 来多次运行一条语句,并返回总的持续时间。

这里,我们使用 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

这表明,除非你的应用的瓶颈是字符串连接,否则可能不值得太关注......

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

如果你正在执行 千万 的操作,你会看到速度提高了大约1秒。

请注意,您的结果可能会有很大的不同,这取决于您要连接的字符串的长度(和数量),以及您正在运行的硬件。


4
投票

对于两个字符串 ab,只需使用 a + b. 替代品是加入 更多 2个以上的字符串,避免了临时的 str 的每次使用而创建的对象。+以及由于在下一个结果中重复复制前面操作的内容而导致的二次元行为。

还有 f'{a}{b}'但它在语法上更重,而且不比 a + b.)


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}')

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

© www.soinside.com 2019 - 2024. All rights reserved.