【发布时间】:2014-01-31 12:59:28
【问题描述】:
在 Python 中,我们将 lru_cache 作为函数包装器。将其添加到您的函数中,该函数只会针对每个不同的输入参数计算一次。
示例(来自 Python 文档):
@lru_cache(maxsize=None)
def fib(n):
if n < 2:
return n
return fib(n-1) + fib(n-2)
>>> [fib(n) for n in range(16)]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610]
>>> fib.cache_info()
CacheInfo(hits=28, misses=16, maxsize=None, currsize=16)
不知道Matlab中是否存在类似的东西?目前我正在使用缓存文件,如下所示:
function result = fib(n):
% FIB example like the Python example. Don't implement it like that!
cachefile = ['fib_', n, '.mat'];
try
load(cachefile);
catch e
if n < 2
result = n;
else
result = fib(n-1) + fib(n-2);
end
save(cachefile, 'result');
end
end
我这样做的问题是,如果我改变我的功能,我需要删除缓存文件。
当我更改函数并且缓存已失效时,Matlab 是否有办法做到这一点?
【问题讨论】:
-
我会使用一个 container.Map 存储在一个持久变量中。
-
如果您可以将内容写入缓存,那么包含文件最后编辑的日期应该不会太难。一旦你注意到这是不同的,清除它。我想这只会对相当昂贵的功能有价值,否则只需考虑在会话期间将输出存储在网格中。
-
@DennisJaheruddin,这看起来不错,但无法识别函数的变化。
-
@Daniel:container.Map 也不会识别我的功能的变化。 (假设我将 fib 更改为
fib(n) = fib(n-1) + 2*fib(n-2)) -
@Unapiedra:如果更新函数,则清除持久变量。