2014-01-31 77 views
2

在Python中,我们有​​作为函数包装。将它添加到你的函数中,并且函数将只针对每个不同的输入参数进行一次评估。Matlab中是否存在函数缓存?

实例(从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 

我有做这种方式的问题是,如果我改变我的功能,我需要删除的求CacheFile。

有没有办法做到这一点与Matlab实现当我改变了功能和缓存已失效?

+0

我会使用存储在持久变量中的container.Map。 – Daniel

+0

如果您可以将内容写入缓存,那么包含文件上次编辑的日期应该不会太难。一旦你注意到这是不同的,清除它。我想这只会适用于相当昂贵的功能,否则考虑在会话期间将输出存储在网格中。 –

+0

@DennisJaheruddin,这看起来不错,但没有认识到功能的变化。 – Unapiedra

回答

1

我为自己的个人用途创建了类似这样的东西:CACHE类。 (尽管我还没有记录代码)。它似乎比Python的lru_cache更灵活(我没有意识到这一点,谢谢),因为它有几种方法可以精确地调整缓存内容(以节省内存)和如何进行比较。它仍然可以使用一些改进(@丹尼尔的建议使用containers.Map类是一个很好的 - 但它会限制与旧的Matlab版本的兼容性)。代码在GitHub上,因此欢迎您分享并改进它。

这里是它如何使用一个简单的例子:

function Output1 = CacheDemo(Input1,Input2) 

persistent DEMO_CACHE 

if isempty(DEMO_CACHE) 
    % Initialize cache object on first run 
    CACHE_SIZE = 10; % Number of input/output patterns to cache 
    DEMO_CACHE = CACHE(CACHE_SIZE,Input1,Input2); 
    CACHE_IDX = 1; 
else 
    % Check if input pattern corresponds something stored in cache 
    % If not, return next available CACHE_IDX 
    CACHE_IDX = DEMO_CACHE.IN([],Input1,Input2); 
    if ~isempty(CACHE_IDX) && DEMO_CACHE.OUT(CACHE_IDX) > 0 
     [~,Output1] = DEMO_CACHE.OUT(CACHE_IDX); 
     return; 
    end 
end 

% Perform computation 
Output1 = rand(Input1,Input2); 

% Save output to cache CACHE_IDX 
DEMO_CACHE.OUT(CACHE_IDX,Output1); 

我创造了这个类来缓存从耗时的随机模拟结果,自那时以来它在其他一些地方使用,效果良好。如果有兴趣,我可能愿意花些时间记录代码,而不是稍后。如果有一种限制内存使用的方法(在我自己的应用程序中是一个重要的考虑因素),但是获得任意Matlab数据类型的大小并不是微不足道的,那将会很不错。我喜欢将你的想法缓存到一个文件中,这对于更大的数据来说可能是一个好主意。另外,创建一个能够完成Python的lru_cache所做的“精简版”版本可能会很好。