我有一些昂贵的函数f(x),我只想计算一次,但却经常被调用。本质上,当函数第一次被调用时,它应该计算一整串x的值,因为它无论如何都会被积分,然后用样条插值那个值,并以某种方式缓存系数,可能会在一个文件中供进一步使用。
我的想法是做一些类似以下的事情,因为它很容易实现。第一次调用函数时,它会做一些事情,然后重新定义自己,然后再做一些其他的事情。然而,它并不像预期的那样工作,通常可能是一种糟糕的做法。
def f():
def g():
print(2)
print(1)
f = g
f()
f()预期输出:
1
2实际输出:
1
1在f()之外定义g()无济于事。为什么这不起作用?除此之外,我现在能想到的唯一解决方案就是使用一些全局变量。或者以某种方式为此编写一个类有意义吗?
发布于 2011-06-19 17:43:02
这太复杂了。相反,使用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在Python3中,可以用functools.lru_cache替换memoized。
发布于 2011-06-19 17:41:33
只需在f函数的开头添加global f,否则python将创建一个局部f变量。
发布于 2011-06-19 17:38:03
在f的作用域中改变f不会影响函数外部,如果你想改变f,你可以使用global:
>>> def f():
... print(1)
... global f
... f=lambda: print(2)
...
>>> f()
1
>>> f()
2
>>> f()
2https://stackoverflow.com/questions/6401640
复制相似问题