memoize

Добавьте memoization семантику в указатель на функцию

Memoization является методом оптимизации, используемым, чтобы ускорить программы путем кэширования результатов дорогих вызовов функции и возврата кэшируемого результата, когда программа вызвана теми же входными параметрами.

Считайте memoizing вызовом функции, если все следующее верно:

  • Производительность важна.

  • Функция является трудоемкой.

  • Функция имеет возвращаемые значения, которые определяются полностью входными значениями, и не имеет никаких побочных эффектов.

  • Системная память соответствует, чтобы сохранить уникальные комбинации ввода и вывода.

Синтаксис

memoizedFcn = memoize(fh)

Описание

пример

memoizedFcn = memoize(fh) добавляет memoization семантика к указателю функции ввода и возвращает объект MemoizedFunction. Вызовите memoizedFcn, как вы вызвали бы fh. Однако memoizedFcn не является указателем на функцию.

Объект MemoizedFunction поддерживает кэш входных параметров и соответствующих выходных параметров. Когда это вызывается, MATLAB® возвращает связанные кэшируемые выходные значения, если следующие условия верны.

  1. Входные параметры численно равны кэшируемым входным параметрам. При сравнении входных значений MATLAB обрабатывает NaN s как равный.

  2. Количество требуемых выходных аргументов совпадает с количеством кэшируемых выходных параметров, сопоставленных с входными параметрами.

memoization функции сопоставлен с функцией ввода а не с объектом MemoizedFunction. Поэтому помните о следующем.

  • Построение нового объекта MemoizedFunction к той же функции создает другую ссылку на те же данные. Две переменные, что memoize та же функция совместно используют кэш и значения свойства объекта, такие как размер кэша. В следующем примере переменные a и b совместно используют кэш и имеют то же значение для размера кэша.

    a = memoize(@svd);
    b = memoize(@svd);
    Точно так же очистка кэша для b (b.clearCache) также очищает кэш для a и любые другие переменные, что memoize svd функционируют. clearCache является функцией объекта MemoizedFunction.

  • Присвоение объекта MemoizedFunction к новой переменной создает другую ссылку на те же данные. В следующем примере осуществляют обмен данными переменные c и d.

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

  • Очищение переменной не очищает кэш, сопоставленный с функцией ввода. Чтобы очистить кэш для объекта MemoizedFunction, который больше не существует в рабочей области, создайте новый объект MemoizedFunction к той же функции и используйте функцию clearCache на новом объекте. Также можно очистить кэши для всех объектов MemoizedFunction с помощью функции clearAllMemoizedCaches.

Внимание

Объект MemoizedFunction не знает об обновлениях базовой функции. Если вы изменяете функцию, сопоставленную с мемоизованной функцией, очистите кэш с функцией объекта clearCache.

Примеры

свернуть все

Ускорять выполнение сингулярного разложения, когда вы могли работать с теми же входными параметрами многократно, memoize функция svd.

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

Создайте матрицу и кэшируйте результаты сингулярного разложения. Время вызов функции.

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

Вызовите мемоизованную функцию снова с помощью тех же входных параметров. Наблюдать улучшение скорости с помощью кэшируемых результатов, время вызов функции снова.

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

В вашей текущей рабочей папке создайте файл 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

Memoize computeNumberCombinations функционируют, чтобы ускорить вычисление для повторных входных значений.

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

Вызовите мемоизованную функцию и время вызов функции. Этот вызов функции кэширует результаты для заданных входных параметров.

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

Вызовите мемоизованную функцию и время вызов функции снова. Этот вызов функции использует кэшируемые результаты и не выполняет функцию.

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

Входные параметры

свернуть все

Функция к memoize, заданному как указатель на функцию.

Пример: memoizedEigs = memoize(@eigs)

Типы данных: function_handle

Советы

  • Множественные вызовы memoize с тем же указателем на функцию возвращают тот же объект MemoizedFunction. Например:

    x = memoize(@plus);
    y = memoize(@plus);
    x == y
    ans =
    
      logical
    
       1
  • Вы не должны memoize функция с побочными эффектами, такими как установка некоторого глобального состояния или выполнение операций I/O. Побочные эффекты не повторяются на последующих вызовах мемоизованной функции с теми же входными параметрами. Например, если вы memoize функция 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