Python:从函数中重新定义函数

时间:2011-06-19 09:34:45

标签: python

我有一些昂贵的函数f(x),我想只计算一次,但是频繁调用。从本质上讲,第一次调用函数时,它应计算一系列x的一大堆值,因为它将无论如何都要集成,然后用样条函数对其进行插值,并以某种方式缓存系数,可能在文件中进一步使用。

我的想法是做类似以下的事情,因为它很容易实现。第一次调用函数时,它会执行某些操作,然后重新定义自身,然后再执行其他操作。但是,它没有按预期工作,通常可能是不好的做法。

def f():
    def g():
        print(2)
    print(1)
    f = g
f()
f()

预期产出:

1
2

实际输出:

1
1

在f()之外定义g()没有帮助。为什么这不起作用?除此之外,我现在能想到的唯一解决方案是使用一些全局变量。或者以某种方式为此写一个类是否有意义?

5 个答案:

答案 0 :(得分:6)

这太复杂了。相反,请使用memoization:

def memoized(f):
    res = []
    def resf():
       if len(res) == 0
           res.append(f())
       return res[0]
    return resf

然后简单地

@memoized
def f():
   # expensive calculation here ...
   return calculated_value

在Python 3中,您可以将memoized替换为functools.lru_cache

答案 1 :(得分:5)

只需在f函数的开头添加global f,否则python会创建一个本地f变量。

答案 2 :(得分:3)

更改f范围内的f不会影响函数外部,如果要更改f,则可以使用global:

>>> def f():
...     print(1)
...     global f
...     f=lambda: print(2)
... 
>>> f()
1
>>> f()
2
>>> f()
2

答案 3 :(得分:3)

您可以使用memoizationdecoration来缓存结果。查看示例here。可以找到关于可能证明有用的记忆的单独问题here

答案 4 :(得分:1)

您所描述的是缓存发明的问题类型。为什么不只是有一个缓冲区来保存结果;在进行昂贵的计算之前,检查缓冲区是否已经填满;如果是,则返回缓冲结果,否则,执行计算,填充缓冲区,然后返回结果。不需要为此修改自我修改代码。