Python Yield: solución de datos masivos

El rendimiento de Python es una técnica para procesar grandes cantidades de datos en incrementos más pequeños. Explicamos cómo usar la palabra clave yield en Python y por qué es importante el concepto del generador.

Índice
  1. Antecedentes y casos de uso
  2. ¿ Qué es el rendimiento de Python ?
  3. Concepto de lo iterable
  4. Generadores como enlace entre Iterable y Python yield
  5. Rendimiento de pitón
  6. Ejemplo de rendimiento de Python : trabajar con grandes conjuntos de datos
    1. Ejemplo usando Python Yield
  7. Conclusión
    1. Enlaces relacionados

Antecedentes y casos de uso

Los primeros programadores tenían que ser lo más económicos posible con los recursos: el hardware ofrecía muchas restricciones, la memoria, por ejemplo, era escasa. Afortunadamente, el hardware actual es mucho más potente, pero la memoria principal en particular sigue siendo finita hoy en día.

Esto puede causar problemas cuando se procesan grandes cantidades de datos, ya que no se pueden cargar en la memoria principal de una sola pieza. El rendimiento de Python es una posible solución a esto.

Grandes cantidades de datos que hacen que el uso de Python resulte interesante o incluso lo requieran generalmente se pueden dividir en las siguientes tres categorías:

  • Leer archivos grandes como listas CSV
  • Genera series infinitas de números o listas
  • Realice operaciones de comparación donde el algoritmo genera grandes conjuntos de trabajo

¿ Qué es el rendimiento de Python ?

Pero, ¿qué significa exactamente yield en Python? En pocas palabras, la palabra clave yield en Python hace el mismo trabajo que la palabra clave return : ambas devuelven un valor a la función de llamada.

Sin embargo, a diferencia de return , los programadores con yield ahorran recursos porque solo se devuelve un valor y no, por ejemplo, se generan todos los valores de un bucle completo.

Para comprender el rendimiento en detalle, primero debe comprender el concepto de un iterable y luego comprender lo que hace un generador. Ambos se explican en las siguientes secciones.

Concepto de lo iterable

La mayoría de los lenguajes de programación tienen la herramienta de un bucle; esto se ejecuta y se repite hasta que se logra el resultado deseado. Por ejemplo, puede generar listas de esta manera. En inglés, los mecanismos como los bucles se denominan iteración , las funciones correspondientes son iterables .

  Windows 10: cambiar el fondo de pantalla

Por supuesto, Python también conoce el concepto o el término " iterable ". En el siguiente ejemplo, usamos una función simple de forma iterativa para generar datos.

meineliste = [x*x for x in range(5)]
for i in meineliste:
print(i)

Aquí, en el ejemplo, solo se generan 5 números, pero en la práctica, los conjuntos de datos pueden ser mucho más grandes. Entonces, el problema: todos los números se mantienen permanentemente en la memoria principal mientras el programa se está ejecutando, y ocupan el espacio apropiado.

Código de muestra de rendimiento de PythonCódigo de muestra de rendimiento de Python

Generadores como enlace entre Iterable y Python yield

Si los volúmenes de datos de una función tan iterativa son muy grandes, tiene sentido no generar todo a la vez, llenar la memoria y, en el peor de los casos, paralizar el PC. (Si sucede, este consejo ayudará: Programa: Forzar cierre )

Los llamados generadores ofrecen una salida al dilema . Un generador itera solo una vez , por lo que se ejecuta a través de un bucle solo una vez por llamada, por ejemplo. Por lo tanto, solo determina el valor cuando se llama la posición correspondiente y la pone a disposición. ¡De esta manera, no utiliza ninguna (o más bien, poca) memoria principal valiosa!

Rendimiento de pitón

Y aquí es donde entra en juego la palabra clave yield . Porque esto convierte una función “normal” en un generador. Una vez que la computadora alcanza el rendimiento mientras ejecuta el código , devuelve el primer valor. Si se vuelve a llamar, vuelve a ejecutar el ciclo y devuelve el siguiente valor, y así sucesivamente.

Básicamente, la única forma de hacer que un generador sea un generador es usar la palabra clave yield en lugar de return.

Ejemplo de rendimiento de Python : trabajar con grandes conjuntos de datos

Nuestro siguiente ejemplo debería aclarar esto.

Una tarea puede ser contar el número de filas en un archivo CSV grande.

csv_gen = csv_reader("Temperaturen.txt")
row_count = 0

for row in csv_gen:
row_count += 1

print(f"Row count is {row_count}")

En este ejemplo, cargamos un archivo "Temperatures.txt" y contamos el número de líneas. Si la función de carga está diseñada de manera simple, el programa simplemente abre el archivo con una llamada abierta y lo lee, así:

def csv_reader(file_name):

file = open(file_name)
result = file.read().split("n")

return result

Esto abre el archivo, lo lee y lo divide en líneas individuales con "file.read.split", que luego se almacenan en un elemento de lista de Python. Esto consume memoria principal , que está particularmente limitada en sistemas compactos como Raspberry Pi o computadoras integradas similares.

  Comparta ordenadores con Vista en la red

En algún momento durante el proceso de lectura, el sistema se ralentizará drásticamente y en algún momento informará un error de memoria.

Ejemplo usando Python Yield

En lugar de la variante anterior, la función de importación también se puede diseñar de manera diferente, por ejemplo, así:

def csv_reader(file_name):

for row in open(file_name, "r"):
yield row

Usando la palabra clave yield , convertimos la expresión llamada csv_reader() en una función generadora. Sin  yield  , Python repetiría tantas veces como filas haya en el archivo CSV y las colocaría en un elemento de la lista.

En este caso, todos los datos tendrían que estar presentes en la memoria principal.

Por lo tanto, el rendimiento de Python garantiza que el archivo se abra, itera a través de cada línea, pero los valores no se devuelven inmediatamente a la función de llamada.

Conclusión

El rendimiento de Python ayuda a ahorrar recursos y programa de manera eficiente. Su uso requiere que el programador comprenda la interacción entre los bucles, el procesamiento iterativo y el manejo paso a paso de los valores devueltos. El rendimiento enmascara a estos últimos, por así decirlo, y no los mantiene en bloque en la memoria principal.

Enlaces relacionados

Rendimiento en la documentación oficial

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir