python - 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 B
0.2 秒后看到两条线执行所需的行为:
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"
),然后从池中的元组中产生结果(使用这些元组的索引数组)。
推荐阅读
- python - 熊猫扩展行数
- apache-kafka - 原因:org.apache.avro.AvroRuntimeException:格式错误的数据。长度为负:-53
- powershell - 如何从其他类中处理通过 Add-Type 添加的类的静态成员?
- amazon-cloudformation - 在 aws config 模板的云形成中将补救操作作为参数传递
- python - python中的连续字母列表并获取它的每个值
- android - 未找到符号 ExoPlayerFactory
- python - Python:请求 url 不接受函数?
- image - 来自未正确预测的图像的 Keras 线性回归模型
- python - 是否有可能拥有一个带有分配给它的值列表的属性?
- php - laravel 全球国家列表可在任何页面上使用