在其他函数中多次调用一个函数

费德里科·维加

我有以下功能:

def f(x):
    return x

def f2(x):
    y = f(x)
    return y + x + 1

def f3(x):
    y = f(x)
    return y + x + 2

def DoAll(x):
    i2 = f2(x)
    i3 = f3(x)
    return i2, i3

print(DolAll(2))

即使这段代码运行,由于我f(x)多次调用,它似乎效率很低。如何在不定义f2(x, y)and的情况下解决这个问题f3(x, y)我想使用类似的东西

def f(x):
    return x

def f2(x):
    nonlocal y
    return y + x + 1

def f3(x):
    nonlocal y
    return y + x + 2

def DoAll(x):
    y = f(x)
    f2 = f2(x)
    f3 = f3(x)
    return f2, f3

print(DolAll(2))

当然,这里显示的代码不起作用。

疯狂的物理学家

您可以使用缓存来避免重做计算。Python 开箱即用地提供了这样的功能functools.lru_cache

from functools import lru_cache

@lru_cache()
def f(x):
    ...

这比仅仅让值全局可用更通用,因为它允许多个计算同时存储值。

如果您的函数是确定性的并且没有副作用,您也可以通过缓存所有中间结果来完全缩短嵌套调用的计算:

@lru_cache()
def f(x):
    print(f'Called f({x})')
    return x

@lru_cache()
def f2(x):
    print(f'Called f2({x})')
    y = f(x)
    return y + x + 1

@lru_cache()
def f3(x):
    print(f'Called f3({x})')
    y = f(x)
    return y + x + 2

@lru_cache()
def DoAll(x):
    print(f'Called DoAll({x})')
    i2 = f2(x)
    i3 = f3(x)
    return i2, i3

>>> DoAll(1)
Called DoAll(1)
Called f2(1)
Called f(1)
Called f3(1)
(3, 4)

>>> DoAll(2)
Called DoAll(2)
Called f2(2)
Called f(2)
Called f3(2)
(5, 6)

>>> DoAll(1)
(3, 4)

请注意,对于每个新输入,昂贵的计算只会执行一次。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

创建一个调用其他Lua函数的C ++函数

如何在其他函数内部调用中函数?

__init__中的变量在一个函数中已更改,但未被识别为已在其他函数中更改

reactjs调用了其他组件中的一个函数,为什么

在其他构造函数的调用中调用构造函数时,C ++编译错误

您如何在其他函数中调用OnVolumeDown?

Android Kotlin在其他活动中调用函数

在其他函数中未调用装饰器

我可以在其他两个函数中调用同一个函数吗?

在其他应用程序中调用另一个aspx页面

在Scheme返回值中具有一个函数(或执行其他操作)并自行调用

在其他2个之上添加另一个悬停函数

在其他控制器中调用范围函数

在其他回调js中调用一个回调

Matlab:在其他使用的函数中修改已定义结构的一个字段

在调用函数内部的其他函数之前,函数如何以及在何处保存“一个函数的返回值”?

如何在bash中创建一个在其他函数之间插入新文件名的函数?

[Python]在其他函数中调用的数组函数

如何从C#中其他同级类中的一个类调用同级类的函数

在Haskell中,您能否拥有一个调用其他函数但没有实现的函数的签名?

在其他函数中定义函数

当函数 1 在函数 1 中调用另一个函数 2 时,来自其他文件的函数 1 失败

不能从其他类调用一个函数到一个类

Python - 在其他函数中使用一个函数中的一个变量

Get 方法它在其他函数中工作,但在另一个函数中我看不到 get 方法 TS

调用一个函数,只有在加载其他函数时才调用 (JS/TS)

如何在其他脚本的任何其他函数中调用包含参数的函数?

LuaJ(Java Lua Library):从一个Lua文件调用其他文件中的Lua函数

我可以返回一个函数构造函数并在其他函数中使用吗