Мемоизация с замыканиями
Кэшируйте результаты ресурсоёмких функций в таблице, хранящейся внутри замыкания.
«Мемоизация с замыканиями» — бесплатный урок Lua Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.
Что такое мемоизация
Мемоизация кэширует результаты ресурсоёмких вызовов функций, поэтому повторные вызовы с теми же аргументами сразу возвращают сохранённый результат.
Базовая оболочка мемоизации
Замыкание хранит таблицу cache. При первом вызове результат вычисляется и сохраняется. При повторных вызовах возвращается сохранённое значение.
local function memoize(fn)
local cache = {}
return function(x)
if cache[x] == nil then
cache[x] = fn(x)
end
return cache[x]
end
endМемоизированная функция Фибоначчи
Мемоизация рекурсивной функции Фибоначчи снижает её временную сложность с экспоненциальной до линейной.
local fib
fib = memoize(function(n)
if n <= 1 then return n end
return fib(n-1) + fib(n-2)
end)
print(fib(30)) -- 832040 (fast!)Мемоизация нескольких аргументов
Для функций с несколькими аргументами составляйте строковый ключ кэша из всех аргументов.
local function memoize2(fn)
local cache = {}
return function(a, b)
local key = a .. "," .. b
if cache[key] == nil then cache[key] = fn(a, b) end
return cache[key]
end
endВложенные таблицы кэша
Для аргументов разных типов используйте вложенные таблицы с ключом для каждого аргумента: это обеспечивает поиск за O(1) без сериализации в строку.
local function nestedMemo(fn)
local cache = {}
return function(a, b)
cache[a] = cache[a] or {}
if cache[a][b] == nil then cache[a][b] = fn(a, b) end
return cache[a][b]
end
endИнвалидация кэша
Мемоизация предполагает наличие чистых функций (без побочных эффектов, с одинаковым результатом для одинакового входа). Функции с побочными эффектами не следует мемоизировать без продуманной инвалидации кэша.
Мемоизация на основе TTL
Добавьте логику времени жизни с помощью os.time(), чтобы срок действия записей кэша истекал.
local function memoizeTTL(fn, ttl)
local cache = {}
return function(x)
local entry = cache[x]
if entry and os.time() - entry.time < ttl then
return entry.value
end
cache[x] = {value = fn(x), time = os.time()}
return cache[x].value
end
endКэш со слабыми значениями
Используйте слабые значения, чтобы сборщик мусора мог удалять кэшированные результаты при нехватке памяти.
local function memoizeWeak(fn)
local cache = setmetatable({}, {__mode = "v"})
return function(x)
if cache[x] == nil then cache[x] = fn(x) end
return cache[x]
end
endШаблон рекурсивной мемоизации
Для взаимно рекурсивных функций сначала присвойте мемоизированную оболочку, а затем используйте её в рекурсивном теле, чтобы рекурсия обращалась к кэшу.
Ограниченный кэш (схема LRU)
Для контроля памяти реализуйте кэш LRU, удаляющий запись, к которой дольше всего не обращались, когда размер кэша превышает максимум.
Мемоизация на практике
Распространённые применения: ресурсоёмкие математические вычисления, кэширование результатов запросов к базе данных, компиляция шаблонов Lua и разбор файлов конфигурации.
Вопрос о мемоизации
Почему мемоизацию следует применять только к чистым функциям?
Итоги: мемоизация
Мемоизация использует кэш, хранящийся в замыкании, чтобы сохранять результаты по ключу аргументов и устранять повторные вычисления. Для безопасности памяти используйте слабые таблицы, а для кэшей, чувствительных ко времени, добавляйте TTL.
Часто задаваемые вопросы
Урок «Мемоизация с замыканиями» бесплатный?
Да — полный текст урока «Мемоизация с замыканиями» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.
Чему я научусь в уроке «Мемоизация с замыканиями»?
Кэшируйте результаты ресурсоёмких функций в таблице, хранящейся внутри замыкания. Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Lua Academy?
Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Мемоизация с замыканиями»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Lua Academy?
Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Что такое внешние значения?
- Общие внешние значения замыканий
- Функции-фабрики и генераторы
- Мемоизация с замыканиями