36. Memoization

Crea una función decoradora (o una función que tome otra función) que implemente "memoization". Memoization es una técnica de optimización utilizada para acelerar programas informáticos almacenando los resultados de llamadas a funciones costosas y devolviendo el resultado almacenado cuando se producen las mismas entradas de nuevo.

La función memoize debe tomar una función f y devolver una nueva función que cachee los resultados de f basándose en sus argumentos.

def memoize(func):
    cache = {} # Esto es una variable mutable, pero es interna al decorador
                # La idea es que la función decorada sea inmutable en su comportamiento externo.
    def wrapper(*args):
        # Tu código aquí
        pass
    return wrapper

# Ejemplo de uso con una función recursiva (fibonacci es un buen candidato para memoization)
@memoize
def fibonacci(n):
    if n <= 1:
        return n
    return fibonacci(n - 1) + fibonacci(n - 2)

# Llamadas sucesivas
print(fibonacci(5)) # Calculará fib(5), fib(4), fib(3), fib(2), fib(1), fib(0) una vez cada uno
print(fibonacci(5)) # Usará el caché
print(fibonacci(7)) # Calculará fib(7), fib(6) y usará caché para los menores

Ratoncito

Implementa la memoize para funciones con argumentos simples (que puedan ser claves de diccionario).

Dragón

Considera funciones con argumentos mutables o argumentos no hashables (que no pueden ser claves de diccionario). ¿Cómo podrías manejar esto? O explora cómo limpiar el caché si la función memoized depende de un estado externo que cambia.

This work is under a Attribution-NonCommercial-NoDerivatives 4.0 International license.

Will you buy me a coffee?

Visitors in real time

You are alone: 🐱