Python:多重赋值与单独赋值的速度比较

11 投票
2 回答
3341 浏览
提问于 2025-04-17 21:29

我一直在想办法让我的代码跑得更快。最近,我在浏览这个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

撰写回答