Main Content

memoize

함수 핸들에 메모이제이션 의미 체계 추가

설명

메모이제이션은 프로그램이 동일한 입력값으로 호출될 때 메모리를 많이 차지하는 함수 호출 결과를 캐시하고 캐시된 결과를 반환하여 프로그램 속도를 높이는 최적화 기법입니다.

다음 항목이 모두 해당하는 경우 함수 호출에 대한 메모이제이션을 적용해 보십시오.

  • 높은 성능을 내는 것이 중요합니다.

  • 함수에 많은 시간이 소요됩니다.

  • 함수는 전적으로 입력값에 의해 결정되는 반환 값을 가지며, 부수 효과가 없습니다.

  • 시스템 메모리가 고유한 입력값과 출력값 조합을 저장할 수 있을 만큼 충분합니다.

예제

memoizedFcn = memoize(fh)는 입력 함수 핸들에 메모이제이션 의미 체계를 추가하며, MemoizedFunction 객체를 반환합니다. fh를 불러오듯이 memoizedFcn을 불러옵니다. 그러나 memoizedFcn은 함수 핸들이 아닙니다.

MemoizedFunction 객체는 입력값의 캐시와 이에 대응하는 출력값을 유지합니다. 이를 불러오면 MATLAB®은 다음 조건이 충족되는 경우 연결된 캐시된 출력값을 반환합니다.

  1. 입력 인수는 수치상으로 캐시된 입력값과 동일합니다. 입력값을 비교할 때 MATLAB은 NaN을 같은 값으로 취급합니다.

  2. 요청된 출력 인수의 수는 이러한 입력값과 연결된 캐시된 출력값의 수와 일치합니다.

함수의 메모이제이션은 MemoizedFunction 객체가 아닌, 입력 함수와 연결됩니다. 따라서 다음 사항을 기억하십시오.

  • 동일한 함수에 대한 새 MemoizedFunction 객체를 생성하면 동일한 데이터에 대한 다른 참조가 만들어집니다. 동일한 함수를 메모이제이션하는 두 변수는 캐시와 객체 속성값(예: 캐시 크기)을 공유합니다. 다음 예에서, 변수 ab는 캐시를 공유하며, 동일한 캐시 크기 값을 가집니다.

    a = memoize(@svd);
    b = memoize(@svd);
    마찬가지로, b(b.clearCache)의 캐시를 지우면 a의 캐시와, svd 함수에 대해 메모이제이션을 적용하는 다른 모든 변수도 지워집니다. clearCacheMemoizedFunction 객체 함수입니다.

  • MemoizedFunction 객체를 새 변수에 할당하면 동일한 데이터에 대한 다른 참조가 만들어집니다. 다음 예에서, 변수 cd는 데이터를 공유합니다.

    c = memoize(@svd);
    d = c;

  • 변수를 지워도 해당 입력 함수와 연결된 캐시는 지워지지 않습니다. 작업 공간에 더 이상 존재하지 않는 MemoizedFunction 객체의 캐시를 지우려면 동일한 함수에 대한 새 MemoizedFunction 객체를 만들고, 이 새 객체에 clearCache 함수를 사용하십시오. 또는, clearAllMemoizedCaches 함수를 사용하여 모든 MemoizedFunction 객체의 캐시를 지울 수 있습니다.

주의

MemoizedFunction 객체는 기본 함수에 대한 업데이트를 인식하지 못합니다. 메모이제이션이 적용된 함수와 연결된 함수를 수정하는 경우 clearCache 객체 함수로 캐시를 지우십시오.

예제

모두 축소

동일한 입력값을 여러 번 사용할 수 있는 경우 특이값 분해 수행 속도를 높이려면 svd 함수에 메모이제이션을 적용하십시오.

fh = @svd;
memoizedFcn = memoize(fh);

행렬을 만들고, 특이값 분해 결과를 캐시합니다. 함수 호출 시간을 측정합니다.

X = magic(1234);
tic
[U,S,V]= memoizedFcn(X);
preCachedTime = toc
preCachedTime = 1.2774

동일한 입력값을 사용하여 메모이제이션이 적용된 함수를 다시 호출합니다. 캐시된 결과를 사용하여 개선된 속도를 확인하려면 다시 함수 호출 시간을 측정하십시오.

tic
[U,S,V]= memoizedFcn(X);
postCachedTime = toc
postCachedTime = 0.0448

현재 작업 폴더에, 다음 함수가 들어 있는 computeNumberCombinations.m 파일을 만듭니다. 이 함수는 n개 항목 중에서 한 번에 k개를 선택하는 조합의 수를 계산합니다.

type computeNumberCombinations.m
function c = computeNumberCombinations(n,k)
% Calculate number of combinations of n items taken k at a time
c = fact(n)/(fact(n-k)*fact(k));
end

function f = fact(n)
f = 1;
for m = 2:n
    f = f*m;   
end
end

작업 공간에서 MemoizedFunction 객체에 대한 캐시를 지웁니다.

clearAllMemoizedCaches

computeNumberCombinations 함수에 메모이제이션을 적용해 반복된 입력값에 대한 계산 속도를 높입니다.

fh = @computeNumberCombinations;
memoizedFcn = memoize(fh);

메모이제이션이 적용된 함수를 호출하고, 함수 호출 시간을 측정합니다. 이 함수 호출은 지정된 입력값의 결과를 캐시합니다.

tic
c = memoizedFcn(42e5,137);
preCachedTime = toc
preCachedTime = 0.0513

다시 메모이제이션이 적용된 함수를 호출하고, 함수 호출 시간을 측정합니다. 이 함수 호출은 캐시된 결과를 사용하며, 함수를 실행하지 않습니다.

tic
c = memoizedFcn(42e5,137);
postCachedTime = toc
postCachedTime = 0.0084

입력 인수

모두 축소

메모이제이션을 적용할 함수로, 함수 핸들로 지정됩니다.

예: memoizedEigs = memoize(@eigs)

데이터형: function_handle

  • 동일한 함수 핸들로 memoize를 여러 번 호출하면 동일한 MemoizedFunction 객체가 반환됩니다. 예를 들면 다음과 같습니다.

    x = memoize(@plus);
    y = memoize(@plus);
    x == y
    ans =
    
      logical
    
       1
  • 어떤 전역 상태를 설정하거나 I/O 작업을 수행하는 등의 부수 효과를 갖는 함수에는 메모이제이션을 적용하면 안 됩니다. 부수 효과는 동일한 입력값을 가진 메모이제이션이 적용된 함수에 대한 후속 호출 시 반복되지 않습니다. 예를 들어, randi 함수에 메모이제이션을 적용하는 경우 이 함수는 동일한 입력 인수로 호출 시 항상 동일한 값을 반환합니다.

    fh = @randi;
    memoized_fh = memoize(fh);
    
    fh_result = [fh(100) fh(100) fh(100)]
    memoized_result = [memoized_fh(100) memoized_fh(100) memoized_fh(100)]
    fh_result =
    
        18    71     4
    
    
    memoized_result =
    
        28    28    28

버전 내역

R2017a에 개발됨