首页 > 解决方案 > Itertools.product 构建中介导致内存?

问题描述

我有以下代码

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 B0.2 秒后看到两条线执行所需的行为:

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

那么,这是怎么回事?这是一个错误吗?文档中有问题吗?

标签: pythonitertools

解决方案


中间结果不是在内存中建立的,不是。那是指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"),然后从池中的元组中产生结果(使用这些元组的索引数组)。


推荐阅读