下面的代码从未在Python3.6中打印任何内容
from itertools import product, count
for f in product(count(), [1,2]):
print(f)
相反,它只是坐在那里烧CPU。问题似乎是product
永远不会返回迭代器,如果它在无限空间上,因为它首先计算完整的product
。鉴于product
应该是一个生成器,这一点令人惊讶。在
我本以为这会开始计数(到无穷大),类似于这个生成器的行为(取directly from the docs):
^{pr2}$但是,虽然我的生成器立即开始计数,但使用product
的生成器根本不计数。在
itertools
中的其他工具执行我预期的操作。例如,以下内容:
for f in takewhile(lambda x: True, count()):
print(f)
将打印数字流,因为takewhile
是惰性的。在
我发现了
做我所期望的。这很奇怪,因为它is listed as equivelent in the docs。这看起来像是
itertools.product
中的一个bug,但考虑到它有多标准,似乎不太可能。不,
product
已经是“懒惰”了。问题是
count()
数到无穷大。 来自count
的docs:相当于:
您的代码基本上与执行以下操作相同:
^{pr2}$^{} 懒洋洋地生成结果,但对于参数来说不是这样。他们被热切地评价。每个iterable参数首先转换为一个元组:
参数的计算(不是结果的产生)与文档中显示的Python实现非常相似:
然而,在CPython implementation中,
^{pr2}$pools
是一个元组:这是因为
product
有时需要多次遍历iterable,如果将参数保留为只能使用一次的迭代器,这是不可能的。实际上,您无法从
itertools.count
对象构建元组。在传递给product
之前,考虑使用itertools.islice
将切片到合理的长度。相关问题 更多 >
编程相关推荐