我有一些昂贵的函数f(x),我想只计算一次,但是频繁调用。从本质上讲,第一次调用函数时,它应计算一系列x的一大堆值,因为它将无论如何都要集成,然后用样条函数对其进行插值,并以某种方式缓存系数,可能在文件中进一步使用。
我的想法是做类似以下的事情,因为它很容易实现。第一次调用函数时,它会执行某些操作,然后重新定义自身,然后再执行其他操作。但是,它没有按预期工作,通常可能是不好的做法。
def f():
def g():
print(2)
print(1)
f = g
f()
f()
预期产出:
1
2
实际输出:
1
1
在f()之外定义g()没有帮助。为什么这不起作用?除此之外,我现在能想到的唯一解决方案是使用一些全局变量。或者以某种方式为此写一个类是否有意义?
答案 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)
您可以使用memoization和decoration来缓存结果。查看示例here。可以找到关于可能证明有用的记忆的单独问题here。
答案 4 :(得分:1)
您所描述的是缓存发明的问题类型。为什么不只是有一个缓冲区来保存结果;在进行昂贵的计算之前,检查缓冲区是否已经填满;如果是,则返回缓冲结果,否则,执行计算,填充缓冲区,然后返回结果。不需要为此修改自我修改代码。