sum(x * x for x in range(10**8)) frente a sum([x * x for x in range(10**8)]). ¿Cuál es la diferencia clave?
Opciones
- La versión con generator siempre es más rápida porque se salta el bucle
- La versión con generator mantiene un elemento a la vez, así que la memoria no crece (Opción correcta)
- Ambas versiones son idénticas después de que Python las compila a bytecode
- La versión con lista es lazy y solo crea valores cuando sum los pide
Respuesta
La versión con generator usa una memoria casi constante; la versión con lista construye primero 100 millones de elementos
Por qué
Con corchetes [...] Python primero construye en memoria una lista completa de 100 millones de números, y solo entonces sum los suma.
Con paréntesis (...) es una generator expression: cada número se crea solo cuando sum pide el siguiente, así que solo existe un número a la vez.
Mismo resultado, mucha menos memoria.
Recuerda
Usa generators para datos grandes que solo recorres una vez.