exponenta event banner

memoize

Добавление семантики мемуации в дескриптор функции

Синтаксис

Описание

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

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

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

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

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

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

пример

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

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

  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
  • Не следует запоминать функцию с побочными эффектами, такими как установка какого-либо глобального состояния или выполнение операций ввода-вывода. Побочные эффекты не повторяются при последующих вызовах функции memoized с теми же входами. Например, если запоминать 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