在 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%。

当您达到这种微优化级别时,可能值得重新考虑整个方法或用更快的语言重写。