2014-01-31 78 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所做的「精簡版」版本可能會很好。