Voltar ao código Lua

Recordar resultados caros para no calcularlos dos veces

Memoización en diez líneas: una función que envuelve a otra y guarda lo que ya respondió.

Este post ainda não está no seu idioma; você o vê em espanhol. O código é o mesmo.

O problema

Una función se llama cientos de veces con los mismos argumentos y cada llamada cuesta: una consulta, un cálculo pesado. Calcular una vez y recordar es la optimización más barata.

Lua
local function memoizar(fn)
  local cache = {}
  return function(n)
    local v = cache[n]
    if v == nil then
      v = fn(n)
      cache[n] = v
    end
    return v
  end
end

local precio_con_impuesto
precio_con_impuesto = memoizar(function(codigo)
  print("  (calculando " .. codigo .. ")")      -- simula una consulta cara
  local base = ({ A1 = 100, B2 = 250 })[codigo] or 0
  return base * 1.07
end)

print(precio_con_impuesto("A1"))   -- calcula
print(precio_con_impuesto("A1"))   -- sale de la caché
print(precio_con_impuesto("B2"))   -- calcula

Por que está escrito assim

  1. memoizar recibe una función y devuelve otra que hace lo mismo, pero consulta primero su tabla.
  2. La tabla cache vive en el cierre: cada función memoizada tiene la suya y nadie más la ve.
  3. En Lua las tablas son a la vez diccionario y arreglo, así que la caché no necesita ninguna estructura especial.
  4. El mensaje "calculando" aparece dos veces en tres llamadas: esa es la prueba de que funciona.
Como testar

Guardalo como memo.lua y corré: lua memo.lua

Atenção

La caché no vence nunca: si el precio cambia, la función sigue devolviendo el viejo. Y un resultado nil no se guarda, así que se recalcula cada vez.

Adapte ao seu caso com IA

O botão copia este prompt com o código colado abaixo. Substitua os colchetes pelo que é seu e cole no ChatGPT, Claude, Gemini ou Copilot.

O prompt
Tengo esta memoización en Lua. Extendela para funciones de varios argumentos, con vencimiento de [SEGUNDOS] segundos por entrada y un tope de [CANTIDAD] entradas descartando la más vieja. La voy a usar en [DÓNDE: un juego con LÖVE, Nginx con OpenResty, Redis, Neovim]. Agregá una función para vaciar la caché a mano y mostrame cómo medir cuántos aciertos tiene.

Exemplo escrito e revisado à mão.

Compartilhar

Comentários

Ainda não há comentários. O primeiro pode ser o seu.

Apenas texto, sem links. Não pedimos e-mail. Os comentários são revisados antes de serem publicados.

Adaptou para algo seu?

Me conte o que resolveu com isto, ou o que faltou.

Continue testando

Mais código

Ver todos
Darinel Ortega Online · respondo ao longo do dia
Hoje
Olá. Aqui eu não vendo nada: isto é para trocar conhecimento sobre tecnologia.
Escreva o que quiser — pode mandar texto, imagens ou documentos. As mensagens chegam ao meu console e eu respondo por lá.
Você está escrevendo fora do horário. Eu leio assim que o dia começar.

Conversa aberta para compartilhar conhecimento. As mensagens chegam ao meu console e eu respondo por lá.

Vamos marcar uma conversa

Escolha o dia e a hora que funcionem para você. Trinta minutos, sem discurso comercial.

Videochamada

Para uma videochamada, peça por aqui que eu te mando o link da sessão.