Python:多项任务与个人分配速度

时间:2014-03-09 05:15:02

标签: python performance variable-assignment timeit python-internals

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

  

多次分配比个别分配慢。例如,“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 个答案:

答案 0 :(得分:3)

有趣的是,它可能在某种程度上取决于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

答案 1 :(得分: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

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