Evaluación Perezosa en Scala: Variables y Colecciones Lazy
Resumen
¿Qué es la evaluación perezosa y por qué es importante?
La evaluación perezosa, conocida como "lazy", es un concepto fundamental en ciertos lenguajes de programación, especialmente cuando no estamos seguros del orden de utilización de varías variables o recursos computacionales. En esencia, este método permite que las variables o expresiones se evalúen únicamente cuando son realmente necesarias, optimizando así el tiempo de carga y uso de memoria. Es una técnica relevante en contextos con grandes conjuntos de datos, como el entrenamiento de modelos de aprendizaje automático, donde la eficiencia es clave.
¿Cómo funcionan las variables lazy en Scala?
Scala no implementa la evaluación perezosa por defecto, a diferencia de otros lenguajes como Haskell. En Scala, debemos definir explícitamente las variables como "lazy" usando la palabra clave lazy. Veamos un ejemplo práctico para comprender cómo funciona.
lazyval y = x -1lazyval x =100println(y)// Output: 99
En este ejemplo, a pesar de que x se define después de y, el programa no lanza un error. La expresión y no se evalúa hasta que se llama explícitamente a través de println(y), asegurando que x ya esté instanciado cuando sea necesario.
¿Cuál es la diferencia entre lazy variables y lazy collections?
Una reciente mejora en Scala permite la creación de colecciones perezosas. Sin embargo, no es la colección en su totalidad la que es "lazy", sino los elementos dentro de ella.
val a = LazyList(1,2,3)
Los elementos de la lista no se computan hasta que son utilizados, lo que es particularmente ventajoso cuando trabajamos con listas grandes que pueden no caber completamente en memoria. Este enfoque resulta crítico en aplicaciones como el procesamiento masivo de datos o escenarios donde se gestionan datos extremadamente grandes.
¿Cuándo debo usar la evaluación perezosa?
La evaluación perezosa representa una optimización al ser utilizada:
Para mejorar tiempos de carga: Al evaluar las variables solo cuando son necesarias.
En la inyección de dependencias: Cargando dependencias solo al ser requeridas, evitando instancias innecesarias.
En aplicaciones con limitaciones de memoria: Especialmente importante cuando se manejan grandes conjuntos de datos.
Aunque en algunos lenguajes la evaluación perezosa es predeterminada, en Scala debemos aplicarla de manera intencionada y cuidadosa, sobre todo cuando buscamos optimizar el rendimiento de nuestras aplicaciones. Considera usarla cuando observes que el rendimiento es una prioridad en tu desarrollo y experimenta con sus beneficios para aprovechar al máximo este patrón de programación.
Es una manera para evitar la evaluación de un valor hasta que este sea utilizado. Puede ser útil en casos donde no estamos seguros del orden en que algo se evaluará, o cuando queremos optimizar el tiempo de inicialización de muchos datos
Lazy collections (Scala 2.13)
En el contexto de listas, conjuntos y mapas, tienen un equivalente lazy (.view). Su utilizada viene cuando tenemos colecciones demasiado grandes. Es una manera de optimizar.
lazyval y = x -1lazyval x =100println(y)// En consola no funcionaval a = LazyList(1,2,3)
Ya me lo imaginaba gracias a react
similar al var de javascript
por el hoisting?
Surge cuando no se esta seguro del orden en que se utilizaran las variables, cuando se define como lazy.
No importa que se defina antes el compilador sabra que la debera instancias.
Tambien esta Lazy collection, una manera de usar listas, colecciones, mapas, de manera peresosa.
lazy val y = x -1lazy val x =100println(y)
muy interesante esta funcionalidad para mejorar el performance
LazyList una vez declarados los elementos no son cumputados, solo lo hacen unas vez que se usan
No me gunciona LazyList :/
<console>:11: error: not found: value LazyList
val a = LazyList(1,2,3)
^
Asegurate de tener minimo la versión 2.13.4 de Scala. Puedes ver las versiones usando dentro de la terminal
util.Properties.versionString
o simplemente fijarte en la versión mencionada cuando inicas Scala.