Esto es más bien lo inverso de ¿Para qué se pueden usar las funciones del generador de Python? : los generadores de Python, las expresiones del generador y el itertools
módulo son algunas de mis características favoritas de Python en estos días. Son especialmente útiles al configurar cadenas de operaciones para realizar en una gran cantidad de datos; a menudo los uso cuando proceso archivos DSV.
Entonces, ¿cuándo no es un buen momento para usar un generador, o una expresión generadora, o una itertools
función?
- Cuando debería preferir
zip()
másitertools.izip()
, o range()
terminadoxrange()
, o[x for x in foo]
terminado(x for x in foo)
?
Obviamente, eventualmente necesitamos "resolver" un generador en datos reales, generalmente creando una lista o iterando sobre ella con un ciclo que no sea generador. A veces solo necesitamos saber la longitud. Esto no es lo que estoy preguntando.
Usamos generadores para no asignar nuevas listas a la memoria para datos provisionales. Esto tiene sentido especialmente para grandes conjuntos de datos. ¿Tiene sentido también para pequeños conjuntos de datos? ¿Existe una compensación notable entre memoria y CPU?
Estoy especialmente interesado si alguien ha elaborado algunos perfiles sobre esto, a la luz de la discusión reveladora sobre el rendimiento de comprensión de listas frente a map () y filter () . ( enlace alternativo )
<5
.