¿Cuándo no es un buen momento para usar generadores de pitón?

Esto es más bien el inverso de¿Para qué puedes usar las funciones del generador Python?: generadores de python, expresiones de generador y elitertools El 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 pila de datos; a menudo los uso cuando proceso archivos DSV.

Entonces cuando esno un buen momento para usar un generador, o una expresión de generador, o unitertools ¿función?

¿Cuándo debería preferirzip() terminadoitertools.izip()orange() 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 él con un bucle que no sea generador. A veces solo necesitamos saber la longitud. Esto no es lo que estoy preguntando.

Utilizamos 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? ¿Hay un intercambio notable de memoria / CPU?

Estoy especialmente interesado si alguien ha hecho un perfil sobre esto, a la luz de la discusión reveladora deenumerar el rendimiento de comprensión frente a map () y filter (). (enlace alternativo)