2014-01-31 6 views
2

파이썬에서는 함수 래퍼로 lru_cache이 있습니다. 함수에 추가하면 함수는 다른 입력 인수 당 한 번만 평가됩니다.Matlab에 함수 캐시가 있습니까?

예 (에서 파이썬 문서) :

@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

나는 persistent 변수에 저장된 container.Map을 사용할 것이다. – Daniel

+0

캐시에 내용을 쓸 수 있다면 파일을 마지막으로 편집 한 날짜를 포함시키기가 너무 어려워서는 안됩니다. 이것이 다른 것을 알게되면, 그것을 지우십시오. 이것은 꽤 비싼 함수에 대해서만 가치가 있다고 가정합니다. 그렇지 않으면 세션 중에 출력을 그리드에 저장하는 것을 고려하십시오. –

+0

@DennisJaheruddin, 멋지게 보이지만 기능 변경을 인식하지 못합니다. – Unapiedra

답변

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 데이터 유형의 크기를 얻는 것은 쉽지 않습니다. 나는 파일에 캐싱에 대한 귀하의 생각을 좋아하는데, 이는 더 큰 데이터를위한 좋은 아이디어 일 수 있습니다. 또한, 파이썬의 lru_cache이하는 것을 수행하는 "라이트"버전을 만드는 것이 좋을 수도 있습니다.