... y cada vuelta parecía una lista de comprensión.Me encontré balanceando la lista de comprensión del martillo
En lugar de:
for stuff in all_stuff:
do(stuff)
que estaba haciendo (no asignar la lista para cualquier cosa):
[ do(stuff) for stuff in all_stuff ]
Este es un patrón común que se encuentra en list-comp how-to's. 1) OK, entonces no hay problema, ¿no? Incorrecto. 2) ¿No puede ser solo un estilo de código? Súper mal.
1) Sí, eso estuvo mal. Como señala NiklasB, el de los HowTos es construir una nueva lista.
2) Tal vez, pero no es obvio y explícito, así que mejor no usarlo.
No tuve en cuenta que esos procedimientos estaban en su mayoría basados en línea de comandos. Después de que mi equipo me gritara preguntándome por qué demonios estaba formando listas masivas y luego dejándolas ir, se me ocurrió que podría estar presentando un error importante relacionado con la memoria.
Así que aquí está mi pregunta/s. Si tuviera que hacer esto en un proceso de ejecución muy largo, donde se consumían muchos datos, ¿esta "lista" simplemente continuaría consumiendo mi memoria hasta que la dejaran ir? ¿Cuándo recuperará el recolector de basura la memoria? ¿Después de perder el alcance de esta lista?
Supongo que sí, seguirá consumiendo mi memoria. No sé cómo funciona el recolector de basura de pitón, pero me atrevería a decir que esta lista existirá hasta después de que se llame al next
en all_stuff
.
EDITAR.
La esencia de mi pregunta es transmitida mucho más limpias in this question (gracias por el enlace Niklas)
¿Puede usted hacer algunos puntos de referencia 'timeit' para su último código ¿bloquear? – Blender
@Blender: Meh, parece que no puede probar esto ... Gracias por obligarme a aprenderlo de la manera difícil: P –
Hubo una pregunta hace algún tiempo sobre eso: [Pasar los iteradores a cualquiera para la ejecución de velocidad y ¿Por qué?] (http://stackoverflow.com/q/9144934/1132524) –