Code A
def foo():
pass
for i in range(1000000):
foo()
Code B
for i in range(1000000):
def foo():
pass
foo()
的两个代码段之间的唯一区别是foo
是不断在每次迭代循环内重新定义。
运行一些基准测试:
Code A
10 loops, best of 3: 102 ms per loop
Code B
10 loops, best of 3: 188 ms per loop
因此,该功能的不断重新定义是不必要的开销。
这里是什么Code B
字节代码如下所示:
1 0 SETUP_LOOP 39 (to 42)
3 LOAD_NAME 0 (range)
6 LOAD_CONST 0 (1000000)
9 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
12 GET_ITER
>> 13 FOR_ITER 25 (to 41)
16 STORE_NAME 1 (i)
2 19 LOAD_CONST 1 (<code object foo at 0x103113390, file "<dis>", line 2>)
22 LOAD_CONST 2 ('foo')
25 MAKE_FUNCTION 0
28 STORE_NAME 2 (foo)
4 31 LOAD_NAME 2 (foo)
34 CALL_FUNCTION 0 (0 positional, 0 keyword pair)
37 POP_TOP
38 JUMP_ABSOLUTE 13
>> 41 POP_BLOCK
>> 42 LOAD_CONST 3 (None)
45 RETURN_VALUE
正如你可以看到,函数的定义还没有被优化掉了循环(见线25 MAKE_FUNCTION
)。
这似乎很简单,将函数创建移出循环,因为它的声明显然不是循环执行的条件。
是否有任何明显的障碍妨碍了这一点的完成?
Python做很少的优化,在一般。 – user2357112
(您可以轻松地问为什么它不会优化整个循环。) – user2357112
您是否试过[Pypy](https://pypy.org/),这是一个即时编译器? – gaborous