def main():
for i in xrange(10**8):
pass
main()
这段代码在Python中运行(注:计时是用Linux中BASH中的time函数完成的。)
real 0m1.841s
user 0m1.828s
sys 0m0.012s
但是,如果 for 循环没有放置在函数中,
for i in xrange(10**8):
pass
那么它运行的时间会更长:
real 0m4.543s
user 0m4.524s
sys 0m0.012s
为什么是这样?
在函数内部,字节码是:
2 0 SETUP_LOOP 20 (to 23)
3 LOAD_GLOBAL 0 (xrange)
6 LOAD_CONST 3 (100000000)
9 CALL_FUNCTION 1
12 GET_ITER
>> 13 FOR_ITER 6 (to 22)
16 STORE_FAST 0 (i)
3 19 JUMP_ABSOLUTE 13
>> 22 POP_BLOCK
>> 23 LOAD_CONST 0 (None)
26 RETURN_VALUE
在顶层,字节码是:
1 0 SETUP_LOOP 20 (to 23)
3 LOAD_NAME 0 (xrange)
6 LOAD_CONST 3 (100000000)
9 CALL_FUNCTION 1
12 GET_ITER
>> 13 FOR_ITER 6 (to 22)
16 STORE_NAME 1 (i)
2 19 JUMP_ABSOLUTE 13
>> 22 POP_BLOCK
>> 23 LOAD_CONST 2 (None)
26 RETURN_VALUE
不同之处在于STORE_FAST http://docs.python.org/library/dis.html#opcode-STORE_FAST比 (!) 更快STORE_NAME http://docs.python.org/library/dis.html#opcode-STORE_NAME。这是因为在一个函数中,i
是本地的,但在顶层它是全局的。
要检查字节码,请使用dis module http://docs.python.org/library/dis.html。我能够直接反汇编该函数,但要反汇编顶级代码,我必须使用compile builtin http://docs.python.org/library/functions.html#compile.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)