Python:多重赋值与单独赋值的速度比较
我一直在想办法让我的代码跑得更快。最近,我在浏览这个Python维基页面时,看到了一条说法:
同时赋值比单独赋值要慢。例如 "x,y=a,b" 比 "x=a; y=b" 要慢。
我很好奇,于是我在Python 2.7上进行了测试:
$ python -m timeit "x, y = 1.2, -1.4"
10000000 loops, best of 3: 0.0365 usec per loop
$ python -m timeit "x = 1.2" "y = -1.4"
10000000 loops, best of 3: 0.0542 usec per loop
我多次重复测试,换了不同的顺序等等,但发现同时赋值的代码片段表现得至少快了30%。显然,我代码中涉及变量赋值的部分不会成为性能瓶颈,但我还是很好奇。为什么同时赋值看起来比单独赋值快,而文档却说相反呢?
补充:
我还测试了给超过两个变量赋值,得到了以下结果:
这个趋势看起来大致一致;有没有人能复现这个结果?
(CPU: Intel Core i7 @ 2.20GHz)
2 个回答
1
可以看看Python的dis
模块。这个模块可以把字节码拆解开来。测试展示了两个变量赋值的情况:
import dis
def single_assignment():
x = 1
y = 2
def multiple_assignment():
x, y = 1, 2
print dis.dis(single_assignment)
print dis.dis(multiple_assignment)
字节码:
4 0 LOAD_CONST 1 (1)
3 STORE_FAST 0 (x)
5 6 LOAD_CONST 2 (2)
9 STORE_FAST 1 (y)
12 LOAD_CONST 0 (None)
15 RETURN_VALUE
None
8 0 LOAD_CONST 3 ((1, 2))
3 UNPACK_SEQUENCE 2
6 STORE_FAST 0 (x)
9 STORE_FAST 1 (y)
12 LOAD_CONST 0 (None)
15 RETURN_VALUE
None
看起来在赋值两个变量的情况下,需要的字节码数量是一样的。如果是三个或更多变量赋值,所需的字节码数量反而会更少。
4
有趣的是,这可能在一定程度上与CPU有关。这两台机器都是64位的Linux系统(使用的是相同的Python版本)。
对于英特尔(R) Core(TM)2 Duo CPU T7300 @ 2.00GHz的结果
$ python -V
Python 2.7.5+
$ python -m timeit "x, y = 1.2, -1.4"
10000000 loops, best of 3: 0.0554 usec per loop
$ python -m timeit "x = 1.2" "y = -1.4"
10000000 loops, best of 3: 0.0349 usec per loop
对于英特尔(R) Pentium(R) CPU G850 @ 2.90GHz的结果
$ python -V
Python 2.7.5+
$ python -m timeit "x, y = 1.2, -1.4"
10000000 loops, best of 3: 0.0245 usec per loop
$ python -m timeit "x = 1.2" "y = -1.4"
10000000 loops, best of 3: 0.0394 usec per loop