我一直在寻求从我的代码中获得更多的性能;最近,在浏览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)
答案 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个或更多变量赋值,则字节码数量较小。