Добавьте memoization семантику к указателю на функцию
Memoization является методом оптимизации, используемым, чтобы ускорить программы путем кэширования результатов дорогих вызовов функции и возврата кэшируемого результата, когда программа вызвана теми же входными параметрами.
Считайте memoizing вызовом функции, если все следующее верно:
Производительность важна.
Функция является трудоемкой.
Функция имеет возвращаемые значения, которые определяются полностью входными значениями, и не имеет никаких побочных эффектов.
Системная память соответствует, чтобы сохранить уникальные комбинации ввода и вывода.
memoizedFcn = memoize(fh)
добавляет memoization семантику к указателю функции ввода и возвращает объект memoizedFcn = memoize(fh)
MemoizedFunction
. Вызовите memoizedFcn
, как вы вызвали бы fh
. Однако memoizedFcn
не является указателем на функцию.
Объект MemoizedFunction
поддерживает кэш входных параметров и соответствующих выходных параметров. Когда это вызывается, MATLAB® возвращает связанные кэшируемые выходные значения, если следующие условия верны.
Входные параметры численно равны кэшируемым входным параметрам. При сравнении входных значений MATLAB обрабатывает NaN
s как равный.
Количество требуемых выходных аргументов совпадает с количеством кэшируемых выходных параметров, сопоставленных с входными параметрами.
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
с тем же указателем на функцию возвращают тот же объект 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