Python字符串拼接特殊场景:为何+=比普通赋值更高效?
字符串拼接中
+=与普通赋值的性能差异疑问 我用Python 3.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
这里+=的效率明显更高,但我认为两者拼接次数相同、执行顺序也不影响结果。我知道字符串是不可变类型,这不是原地操作的原因,且我了解的字符串拼接优化多针对.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
我还注意到,在使用'x' + 'y'的场景下,不同Python版本的性能差异明显:
- Python 3.7至3.9:
print(time_1) # ~0.6 print(time_2) # ~0.3
- Python 3.10:
print(time_1) # ~1.7 print(time_2) # ~0.8
- Python 3.11:
print(time_1) # ~0.6 print(time_2) # ~0.1
有一个类似问题提到:
如果s是字符串,
s = s + 'c'可能会原地修改字符串,而t = s + 'c'则不行。但s + 'c'操作怎么知道自己处于哪种场景?
简单来说,当s = s + 'c'时会触发优化,t = s + 'c'则不会,因为Python需要保留原字符串的引用,无法进行原地拼接。
但在我的场景中,两种方式都是将结果赋值给原变量,理论上都应该适用原地拼接优化,这让我感到疑惑。
内容的提问来源于stack exchange,提问作者Dorian Turba
相关产品推荐
相关产品推荐

