在python中反复应用函数而没有循环

问题描述

我有一个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%。

当您达到微优化水平时,可能值得重新考虑整个方法或以更快的语言进行重写。

,

递归调用函数,设置一个基本条件,该条件在每次调用中都会递减。欢呼

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...