0Pricing
Lua Academy · Урок

Мемоизация с замыканиями

Кэшируйте результаты ресурсоёмких функций в таблице, хранящейся внутри замыкания.

«Мемоизация с замыканиями» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Что такое внешние значения?
  2. Общие внешние значения замыканий
  3. Функции-фабрики и генераторы
  4. Мемоизация с замыканиями
← Назад к Lua Academy