Mostrando entradas con la etiqueta yield. Mostrar todas las entradas
Mostrando entradas con la etiqueta yield. Mostrar todas las entradas

lunes, 27 de julio de 2026

Día 28 — Generadores: procesando datos sin agotar la memoria

Un generador es una función especial que utiliza la palabra clave yield en lugar de return, lo que le permite producir valores uno a uno bajo demanda, en lugar de calcular y almacenar todos los resultados de golpe en memoria.

Esta característica los hace ideales para procesar archivos muy grandes, secuencias potencialmente infinitas o flujos de datos continuos, ya que el consumo de memoria se mantiene constante independientemente del volumen de datos procesados.

Código de ejemplo:

def fibonacci(): a, b = 0, 1 while True: yield a a, b = b, a + b generador = fibonacci() for _ in range(8): print(next(generador), end=" ") # 0 1 1 2 3 5 8 13 # Generator expression pares = (n for n in range(100) if n % 2 == 0)




viernes, 10 de abril de 2026

¡Domina la eficiencia con Funciones Generadoras y yield! 🧠💾

Seguimos optimizando cómo manejas grandes volúmenes de datos. Ya vimos las List Comprehensions (creación rápida) y las Generator Expressions (ahorro de memoria). Es el momento de llevar ese ahorro a tus propias funciones.

¿Sabías que una función estándar calcula todos los resultados, los guarda en una lista en la RAM y luego te los devuelve? Si la lista es enorme, tu programa puede colapsar por falta de memoria. Mira este contraste visual: import sys # ❌ FUNCIÓN ESTÁNDAR (Guarda todo en RAM) def cuadrado_lista(n): resultado = [] for i in range(n): resultado.append(i * i) return resultado # Devuelve la lista completa n = 10_000_000 # 10 millones p1_lista = cuadrado_lista(n) #print(p1_lista) # ¡Cuidado si lo imprimes! print(f"RAM Lista (estándar): {sys.getsizeof(p1_lista) / 1024 / 1024:.2f} MB") # Salida: ~80-90 MB (dependiendo de tu arquitectura) La alternativa Pythonic es usar una Función Generadora. En lugar de un return final, usas la palabra clave yield dentro de un bucle. yield pausa la ejecución, devuelve el valor actual y "recuerda" el estado para continuar justo donde se quedó la próxima vez que se lo pidas con next(). # ✅ FUNCIÓN GENERADORA (Calcula bajo demanda ✨) def cuadrado_generador(n): for i in range(n): yield i * i # Devuelve el valor, pausa y recuerda estado p2_gen = cuadrado_generador(n) # No calcula nada aún #print(p2_gen) # Salida: <generator object...> print(f"RAM Objeto Generador: {sys.getsizeof(p2_gen)} bytes") # Salida: ~100-200 bytes (¡Prácticamente nada!) ¿Por qué usar yield y Funciones Generadoras? Consumo de RAM ínfimo: Procesas flujos de datos gigabytes o infinitos sin saturar la memoria, ya que solo guardas el estado actual de la función. Cálculo perezoso (Lazy Evaluation): Ideal para procesar archivos línea por línea, data streams, o cuando solo necesitas los primeros resultados de una búsqueda compleja. Encadenamiento elegante: Puedes crear pipelines de datos encadenando generadores para transformaciones eficientes. ¡Deja de acumular datos y empieza a fluir con ellos usando yield! 🚀💾 Más trucos de rendimiento y buenas prácticas aquí 👇 🎥 https://www.youtube.com/@josecodetech/




jueves, 18 de abril de 2019

71 Python. Generadores

Podemos generar numeros y pasarlos poco a poco a una lista, para ello devolvemos dichos numeros generandolos con bucle y usando yield.
Aqui tienes un ejemplo:

#creamos funcion que devuelve los numeros pares

def num(x):   

for i in range(x):       

if i%2==0:           

yield i

#llamamos a la funcion e imprimimos la lista

print(list(num(20)))