2

Python ではlru_cache、関数ラッパーとして持っています。これを関数に追加すると、関数は異なる入力引数ごとに 1 回だけ評価されます。

例 (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でこれを行う方法はありますか?

4

2 に答える 2

1

私自身の個人的な使用のために、このようなものを作成しました: CACHEクラスです。(私はまだコードを文書化していません。)lru_cache何がキャッシュされるか (メモリを節約するため) を正確に調整するためのいくつかの方法と、どのように比較が行われます。まだいくつかの改良を使用できます(クラスを使用するという@Danielの提案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

于 2014-01-31T17:02:33.010 に答える