¿Itertools.product evalúa sus argumentos perezosamente?
Lo siguiente nunca imprime nada en Python 3.6
from itertools import product, count
for f in product(count(), [1,2]):
print(f)
En cambio, simplemente se queda allí y quema la CPU. El problema parece ser queproduct
nunca devuelve un iterador si está sobre un espacio infinito porque evalúa la totalidadproduct
primero. Esto es sorprendente dado que elproduct
Se supone que es un generador.
Hubiera esperado que esto comenzara a contar (hasta el infinito), algo así como el comportamiento de este generador (tomadodirectamente de los documentos):
for tup in ((x,y) for x in count() for y in [1,2]):
print(tup)
Pero mientras mi generador comienza a contar de inmediato, el que usaproduct
nunca cuenta en absoluto.
Otras herramientas enitertools
haz lo que esperaría. Por ejemplo, lo siguiente:
for f in takewhile(lambda x: True, count()):
print(f)
imprimirá una secuencia de números porquetakewhile
es perezoso.