在python中,为什么s*3比s+s+s快?
In python, why is s*3 faster than s+s+s?
我正在浏览 google 的 python 介绍,发现 s * 3
比 s + s + s
快,其中 s
类型 string
.
发生这种情况的原因是什么?
我 googled 找到了 which is faster s+='a' or s=s+'a' in python。但这并没有帮助
因为s * 3
是一次操作,而s + s + s
是两次操作;它实际上是 (s + s) + s
,创建一个额外的字符串对象,然后被丢弃。
您可以通过使用 dis
查看每个生成的字节码来了解差异:
s + s + s
:
3 0 LOAD_FAST 0 (s)
3 LOAD_FAST 0 (s)
6 BINARY_ADD
7 LOAD_FAST 0 (s)
10 BINARY_ADD
11 RETURN_VALUE
s * 3
:
3 0 LOAD_FAST 0 (s)
3 LOAD_CONST 1 (3)
6 BINARY_MULTIPLY
7 RETURN_VALUE
你也可以在这里自己测试一下:
import timeit
print(timeit.timeit("string=''; string='s'+'s'+'s'", number=10000))
print(timeit.timeit("string2=''; string2='s'*3", number=10000))
我的猜测是 s*3
将其视为一个操作,而 s+s+s
将其视为两个操作。
我正在浏览 google 的 python 介绍,发现 s * 3
比 s + s + s
快,其中 s
类型 string
.
发生这种情况的原因是什么?
我 googled 找到了 which is faster s+='a' or s=s+'a' in python。但这并没有帮助
因为s * 3
是一次操作,而s + s + s
是两次操作;它实际上是 (s + s) + s
,创建一个额外的字符串对象,然后被丢弃。
您可以通过使用 dis
查看每个生成的字节码来了解差异:
s + s + s
:
3 0 LOAD_FAST 0 (s)
3 LOAD_FAST 0 (s)
6 BINARY_ADD
7 LOAD_FAST 0 (s)
10 BINARY_ADD
11 RETURN_VALUE
s * 3
:
3 0 LOAD_FAST 0 (s)
3 LOAD_CONST 1 (3)
6 BINARY_MULTIPLY
7 RETURN_VALUE
你也可以在这里自己测试一下:
import timeit
print(timeit.timeit("string=''; string='s'+'s'+'s'", number=10000))
print(timeit.timeit("string2=''; string2='s'*3", number=10000))
我的猜测是 s*3
将其视为一个操作,而 s+s+s
将其视为两个操作。