Descubra cómo este tipo de función alternativa puede ayudarle a reducir el uso de memoria.

Si está leyendo líneas de un archivo de registro o procesando una larga lista de elementos, una opción es cargar todos los datos en la memoria. Sin embargo, este enfoque puede consumir mucha memoria y afectar el rendimiento. Los generadores ofrecen una solución valiosa.

Los generadores eliminan la necesidad de cargar todos los datos en la memoria simultáneamente. Son útiles cuando se manejan grandes conjuntos de datos, secuencias infinitas o cualquier escenario donde la eficiencia de la memoria sea primordial.

¿Qué son los generadores?

Un generador es una función especial que le permite iterar sobre una secuencia de valores. En lugar de devolver un conjunto completo de datos, generan (o producen) un valor a la vez. Esto los hace eficientes para trabajar con secuencias de datos grandes o ilimitadas.

A función normal de Python normalmente calcula un valor y lo devuelve. Pero los generadores funcionan de manera diferente. Pueden generar múltiples valores a lo largo del tiempo al pausar y reanudar la ejecución entre cada rendimiento.

instagram viewer

La distinción clave entre funciones regulares y generadores es que en lugar de utilizar el devolver palabra clave para producir un resultado, los generadores utilizan producir.

Cómo crear un generador

Para crear un generador, en lugar del devolver declaración, utilice un producir declaración dentro de la función. El producir La palabra clave no solo indica a la función que devuelva un valor, sino que también le permite guardar su estado, lo que permite una futura reanudación.

Aquí hay un ejemplo de una función generadora simple:

defnumeric_generator():
yield1
yield2
yield3

gen = numeric_generator()

Esta función generadora produce valores numéricos del 1 al 3.

El producir La declaración guarda el estado de la función, preservando las variables locales entre llamadas, para reanudarla cuando solicite el siguiente valor.

Asignar una función generadora a una variable crea un objeto generador con el que puede trabajar.

Trabajar con generadores

Los generadores tienen múltiples aplicaciones. Puedes usarlos en bucles for o dentro de la lista de comprensiones, así como otras estructuras iterables. Los generadores también pueden servir como argumentos para funciones.

Una vez que haya creado un generador, puede iterarlo usando un bucle for:

for i in numeric_generator():
print(i)

También puedes utilizar el próximo función para recuperar valores uno por uno:

print(next(gen)) # 1
print(next(gen)) # 2
print(next(gen)) # 3

Esto le brinda más control sobre el objeto generador.

Los generadores pueden realizar un seguimiento de su estado. Cada declaración de rendimiento en una función actúa como un punto de control. Cuando llamas al próximo() función en el objeto generador, la ejecución comienza desde el punto de rendimiento anterior.

También puede pasar valores a un generador usando enviar():

defgenerator_with_send():
# First yield: Receive a value
x = yield
print(f"Received: {x}")

# Second yield: Receive another value
y = yield
print(f"Received: {y}")

# Third yield: Yield the sum
yield x + y

gen = generator_with_send()

# Start generator and reach first yield
next(gen)

# Send 10 into generator, received at first yield
result = gen.send(10)

# Send 5 into generator, received at second yield
result = gen.send(5)

# Print result of third yield
print(result)

El enviar() El método le permite recuperar valores del generador y enviar valores de regreso a la función del generador, deteniéndola efectivamente y permitiéndole controlar su ejecución. El enviar() El método es útil al escribir corrutinas o utilizar generadores para fines avanzados.

Usar expresiones generadoras

Las expresiones generadoras proporcionan una forma concisa de crear un generador simple y anónimo. Son similares a las listas por comprensión, pero utilizan paréntesis en lugar de corchetes.

Aquí hay un ejemplo:

gen = (i**2for i in range(10))

for x in gen:
print(x)

El código crea una expresión generadora que produce los cuadrados de los números del 0 al 9. Las expresiones generadoras son ideales para generar de forma perezosa una secuencia de valores.

Uso de generadores para el procesamiento de datos

Los generadores de Python son una forma conveniente de describir flujos de datos y crear iteradores sin mantener todo en la memoria. Puede mejorar significativamente su programación aprendiendo a usar generadores, lo que facilita el manejo de tareas desafiantes de procesamiento de datos.

La próxima vez que trabaje con grandes conjuntos de datos, tenga en cuenta los generadores y delégueles las tareas que requieren mucha mano de obra, para que su código siga siendo receptivo y eficiente.