10

我一直在寻求从我的代码中挤出更多的性能;最近,在浏览这个 Python wiki 页面时,我发现了这个说法:

多重赋值比单独赋值慢。例如“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:英特尔酷睿 i7 @ 2.20GHz)

4

2 回答 2

4

有趣的是,它可能在某种程度上取决于 CPU。这些都是 64 位 linux 机器(相同的 Python 版本)。

Intel(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

Intel(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
于 2014-03-09T05:28:56.087 回答
1

更好地看dispython的模块。哪个反汇编字节码。测试显示了两个变量赋值:

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

在 2 个变量的情况下,看起来所需的字节码数量相同。如果有 3 个或更多变量分配,则字节码的数量会更小。

于 2014-03-09T05:29:20.163 回答