memoize

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

Синтаксис

Описание

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

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

  • Эффективность важна.

  • Функция занимает много времени.

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

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

пример

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

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

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

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

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

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

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

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

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

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

Внимание

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

Примеры

свернуть все

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

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

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

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

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

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

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

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

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

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

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

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

свернуть все

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

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

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

Совет

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

    x = memoize(@plus);
    y = memoize(@plus);
    x == y
    ans =
    
      logical
    
       1
  • Вы не должны запоминать функцию с побочными эффектами, такими как установка некоторого глобального состояния или выполнение операций ввода-вывода. Побочные эффекты не повторяются при последующих вызовах запоминаемой функции с теми же входами. Для примера, если вы запоминаете randi функция memoized всегда возвращает то же значение при вызове с тем же входным параметром.

    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