有几种方法可以优化此代码:
>使用itertools.repeat(None,times)控制循环次数更快(这可以避免在每次迭代时创建新的,未使用的整数对象).
>您可以通过将其置于函数或生成器中来获得速度(局部变量比全局变量更快.
>您可以通过将中间结果保存在变量中来获得速度,避免[-1]索引查找(LOAD_FAST / STORE_FAST比LOAD_CONST -1和BINARY_SUBSCR更快).
>您可以使用预绑定方法而不是y.append来提高速度.
例如:
from itertools import repeat
def nest(func, x, times):
result = [x]
result_append = result.append
for _ in repeat(None, times):
x = func(x)
result_append(x)
return result
这是一个示例调用:
>>> def double(x):
return 2 * x
>>> nest(double, 3, 5)
[3, 6, 12, 24, 48, 96]
这是反汇编显示紧密内循环,使用局部变量和绑定方法:
>>> from dis import dis
>>> dis(nest)
2 0 LOAD_FAST 1 (x)
3 BUILD_LIST 1
6 STORE_FAST 3 (result)
3 9 LOAD_FAST 3 (result)
12 LOAD_ATTR 0 (append)
15 STORE_FAST 4 (result_append)
4 18 SETUP_LOOP 45 (to 66)
21 LOAD_GLOBAL 1 (repeat)
24 LOAD_CONST 0 (None)
27 LOAD_FAST 2 (times)
30 CALL_FUNCTION 2
33 GET_ITER
>> 34 FOR_ITER 28 (to 65)
37 STORE_FAST 5 (_)
5 40 LOAD_FAST 0 (func)
43 LOAD_FAST 1 (x)
46 CALL_FUNCTION 1
49 STORE_FAST 1 (x)
6 52 LOAD_FAST 4 (result_append)
55 LOAD_FAST 1 (x)
58 CALL_FUNCTION 1
61 POP_TOP
62 JUMP_ABSOLUTE 34
>> 65 POP_BLOCK
7 >> 66 LOAD_FAST 3 (result)
69 RETURN_VALUE