问题描述
我有一个python函数,我想多次将该值应用于一个值。我知道我可以通过for循环来做到这一点:
for i in range(N_iter):
val=f(val)
但是有没有更有效的方法,也许使用itertools或functools?
解决方法
您至少可以做两件事:使用局部变量并展开循环。
这是基线:
def f(x):
return x+1
N_iter=16777216
val=0
for i in range(N_iter):
val=f(val)
print(val)
在我的系统上,这大约需要0m2.448s
。
以下是所有引用都是本地引用时的代码,这意味着Python不必每次都加载和存储它们:
def f(x):
return x+1
def iterate(f,N_iter,val):
for i in range(N_iter):
val=f(val)
print(val)
iterate(f,16777216,0)
这需要0m1.648s
。
您还可以手动展开循环,每次跳转进行更多的迭代。这是8(为简单起见,它不处理余数):
def f(x):
return x+1
def iterate(f,val):
for i in range(N_iter//8):
val=f(val)
val=f(val)
val=f(val)
val=f(val)
val=f(val)
val=f(val)
val=f(val)
val=f(val)
print(val)
iterate(f,0)
这需要0m1.327s
。
他们共同加快了这个紧密循环的速度,将近50%。
当您达到微优化水平时,可能值得重新考虑整个方法或以更快的语言进行重写。
,递归调用函数,设置一个基本条件,该条件在每次调用中都会递减。欢呼