Comprensiones de lista de Python frente a expresiones de generador

¿Qué es la comprensión de listas?
Es una forma elegante de definir y crear una lista. La comprensión de listas nos permite crear una lista usando for loop con menos código. Lo que normalmente requiere de 3 a 4 líneas de código, se puede comprimir en una sola línea.

Ejemplo:

# initializing the list
list = []
  
for i in range(11):
    if i % 2 == 0:
        list.append(i)
  
# print elements
print(list)

Producción:

 0 2 4 6 8 10

Ahora, la misma salida se puede derivar de una sola línea de código.

list = [i for i in range(11) if i % 2 == 0]
print(list)

Producción:

 0 2 4 6 8 10

¿Qué son las expresiones generadoras?
Las expresiones generadoras son algo similares a las listas de comprensión, pero las primeras no construyen objetos de lista. En lugar de crear una lista y mantener toda la secuencia en la memoria, el generador genera el siguiente elemento en demanda.
Cuando se llama a una función normal con una declaración de retorno, termina cada vez que recibe una declaración de retorno. Pero una función con una declaración de rendimiento guarda el estado de la función y puede recuperarse del mismo estado la próxima vez que se llame a la función.
La expresión del generador nos permite crear un generador sin la palabra clave yield.

Diferencia de sintaxis: se utilizan paréntesis en lugar de corchetes.

# List Comprehension
list_comprehension = [i for i in range(11) if i % 2 == 0]
  
print(list_comprehension)

Producción:

 0 2 4 6 8 10
# Generator Expression
generator_expression = (i for i in range(11) if i % 2 == 0)
  
print(generator_expression)

Producción:

<generator object  at 0x000001452B1EEC50>

En el ejemplo anterior, si queremos imprimir el resultado de las expresiones del generador, simplemente podemos iterarlo sobre el objeto del generador.

for i in generator_expression:
    print(i, end=" ")

Producción:

0 2 4 6 8 10

Entonces, ¿cuál es la diferencia entre las expresiones de generador y las comprensiones de lista?
El generador produce un artículo a la vez y genera artículos solo cuando hay demanda. Mientras que, en una lista de comprensión, Python reserva memoria para toda la lista. Por lo tanto, podemos decir que las expresiones generadoras son más eficientes en memoria que las listas.
Esto lo podemos ver en el siguiente ejemplo.

# import getsizeof from sys module
from sys import getsizeof
  
comp = [i for i in range(10000)]
gen = (i for i in range(10000))
  
#gives size for list comprehension
x = getsizeof(comp) 
print("x = ", x)
  
#gives size for generator expression
y = getsizeof(gen) 
print("y = ", y)

Producción:

x =  87624
y =  88

Acabamos de ver que la expresión del generador es eficiente en memoria. Pero, ¿también son eficientes en el tiempo? Comprobemos esto con un ejemplo.

#List Comprehension: 
import timeit
  
print(timeit.timeit('''list_com = [i for i in range(100) if i % 2 == 0]''', number=1000000))

Producción:

8.118047142050102
#Generator Expression:
import timeit
  
print(timeit.timeit('''gen_exp = (i for i in range(100) if i % 2 == 0)''', number=1000000))

Producción:

0.7548244756850693

Hay una notable diferencia en el tiempo de ejecución. Por lo tanto, las expresiones generadoras son más rápidas que la comprensión de listas y, por lo tanto, eficientes en el tiempo.

Publicación traducida automáticamente

Artículo escrito por Pulkit_Singh y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

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