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)


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

英特尔(R)奔腾(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

最好看一下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个或更多的变量赋值,则字节码的数量更小。

链接地址: http://www.djcxy.com/p/19415.html

上一篇: Python: multiple assignment vs. individual assignment speed

下一篇: Getting json from types