我使用的是以下代码,使用的是python3.11:
import timeit
code_1 = """
initial_string = ''
for i in range(10000):
initial_string = initial_string + 'x' + 'y'
"""
code_2 = """
initial_string = ''
for i in range(10000):
initial_string += 'x' + 'y'
"""
time_1 = timeit.timeit(code_1, number=100)
time_2 = timeit.timeit(code_2, number=100)
print(time_1)
# 0.5770808999950532
print(time_2)
# 0.08363639999879524
为什么+=
比in this case更有效率?
据我所知,有相同数量的串联,执行顺序不会改变结果.
因为字符串是不变的,这并不是因为就地拼接,我发现关于字符串连接的唯一一件事是大约.join
的效率,但我不想要最高效的,只要理解为什么+=
似乎比=
更高效.
使用此代码,表单之间的性能几乎相等:
import timeit
code_1 = """
initial_string = ''
for i in range(10000):
initial_string = initial_string + 'x'
"""
code_2 = """
initial_string = ''
for i in range(10000):
initial_string += 'x'
"""
time_1 = timeit.timeit(code_1, number=100)
time_2 = timeit.timeit(code_2, number=100)
print(time_1)
# 0.07953230000566691
print(time_2)
# 0.08027460001176223
我注意到了使用不同的Python版本('x' + 'y'
形式)时的不同:
Python3.7到3.9:
print(time_1)
# ~0.6
print(time_2)
# ~0.3
Python3.10:
print(time_1)
# ~1.7
print(time_2)
# ~0.8
对比一下,Python3.11:
print(time_1)
# ~0.6
print(time_2)
# ~0.1
类似但没有回答问题:How is the s=s+c string concat optimization decided?
如果s是一个字符串,那么s=s+‘c’可能会修改该字符串,而t=s+‘c’则不能.但是,操作s+‘c’如何知道它处于哪种情况呢?
简而言之:优化在s = s + 'c'
时发生,而不是在t = s + 'c'
时,因为Python需要保持对第一个字符串的引用,并且不能就地连接.
在这里,我们总是使用简单赋值或扩充赋值来赋值给原始字符串,因此在这两种情况下都应该应用就地连接.