在 python 中重复应用函数而不循环
apply function repeatedly in python without loops
我有一个 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, N_iter, 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, 16777216, 0)
这需要 0m1.327s
。
他们一起将这个紧密循环的速度提高了近 50%。
当您达到这种微优化级别时,可能值得重新考虑整个方法或用更快的语言重写。
我有一个 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, N_iter, 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, 16777216, 0)
这需要 0m1.327s
。
他们一起将这个紧密循环的速度提高了近 50%。
当您达到这种微优化级别时,可能值得重新考虑整个方法或用更快的语言重写。