Itertools.product buiding intermediary results in memory?



我有以下代码

from itertools import product
from time import sleep
def slowrange(n,t):
for i in range(n):
sleep(t)
yield i
for n,w in product(slowrange(5,0.2),"AB"):
print(n,w)

因为在itertools.product文档中说:

此函数大致等效于以下代码,除了实际的实现没有建立中间结果内存中

我预计我会看到0 A n 0 B的两行,然后0.2秒后我会看到下面的迭代,然而,这并没有发生,在1s之后,所有的迭代都被打印出来,如果我使用下面的函数而不是itertools.product,它确实会执行所需的行为:

def product(itertor1,iterator2):
for s in iterator1:
for f in iterator2:
yield s,f

那么,发生了什么事?,这是个虫子吗?,文件里有什么问题吗?

中间结果没有建立在内存中。这是指Python代码中的这一部分:

result = [[]]
for pool in pools:
result = [x+[y] for x in result for y in pool]

所做的是将输入迭代器转换为池中的元组,第一行:

pools = [tuple(pool) for pool in args] * repeat

池不是中间结果。您的slowrange()首先被消耗到一个元组中(然后根据"AB"字符串中的字符创建另一个元组(,然后根据池中的元组生成结果(使用这些元组中的索引数组(。

最新更新