¿Qué es la evaluación perezosa y cuando usarlo?
Hablamos de una técnica de programación en la que una expresión o una función no se evalúa hasta que no sea necesario. Esto significa que la expresión se evalúa solo cuando los resultados se necesitan para una operación en particular, en lugar de evaluarla de inmediato. Esto se usa para mejorar el rendimiento y la eficiencia del programa, al evitar evaluar expresiones innecesarias.
Veamos un ejemplo en Python:
def lazy_sum(*args):
def sum():
resultado = 0
for num in args:
resultado = resultado + num
return resultado
return sum
total = lazy_sum(1, 2, 3, 4, 5) # Aún no se ha calculado la suma
# En "total" solo esta la expresión de la operación
print(total()) # Ejecutamos la operación cuando lo necesitamos
# En otras palabras: al imprimir
# Devuelve: 15
Otro ejemplo muy habitual en Python son los generadores con yield. Permiten producir valores bajo demanda, sin construir toda la secuencia en memoria:
def numeros_pares():
n = 0
while True:
yield n
n += 2
generador = numeros_pares() # No se ha calculado nada todavía
print(next(generador)) # 0
print(next(generador)) # 2
print(next(generador)) # 4
Fíjate que numeros_pares define una secuencia infinita, pero el programa no se cuelga: cada valor se calcula solo cuando lo pides con next(). Esto es perfecto para leer ficheros enormes línea a línea o procesar flujos de datos sin saturar la memoria.
Se debe utilizar cuando una función o expresión no se necesita de inmediato para una operación. También puede ser útil para mejorar la legibilidad de los programas al permitir que se expresen conceptos complejos de forma sencilla.
Muchos lenguajes de programación modernos, como Haskell, Clojure, Python y JavaScript, utilizan evaluación perezosa. Esto permite a los programadores escribir código más limpio y eficiente. Esta técnica es especialmente útil en lenguajes funcionales, como Haskell, donde el código se organiza en forma de expresiones. De hecho, en Haskell la evaluación perezosa es el comportamiento por defecto, lo que permite escribir cosas tan elegantes como:
take 10 [1..] -- [1,2,3,4,5,6,7,8,9,10]
[1..] es la lista de todos los números naturales, una lista infinita, y take 10 solo consume los diez primeros. Sin lazy evaluation, esta expresión sería imposible de ejecutar.
Esta y otras técnicas nos ayudarás a optimizar el software, pero sobretodo a entender como funciona ciertas optimizaciones internas en nuestros lenguajes funcionales favoritos. Ahora que ya conoces la magia que hay detrás, podrás replicarlo y utilizarlo con inteligencia.
Este trabajo está bajo una licencia Attribution-NonCommercial-NoDerivatives 4.0 International.
Apóyame en Ko-fi
Comentarios
Todavía no hay ningún comentario.