The following never prints anything in Python 3.6
from itertools import product, count
for f in product(count(), [1,2]):
print(f)
Instead, it just sits there and burns CPU. The issue seems to be that product
never returns an iterator if it's over an infinite space because it evaluates the full product
first. This is surprising given that the product
is supposed to be a generator.
I would have expected this to start counting up (to infinity), something like the behavior of this generator (taken directly from the docs):
for tup in ((x,y) for x in count() for y in [1,2]):
print(tup)
But whereas my generator starts counting immediately, the one using product
never counts at all.
Other tools in itertools
do what I'd expect. For example, the following:
for f in takewhile(lambda x: True, count()):
print(f)
will print a stream of numbers because takewhile
is lazy.
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…