我需要动态构建由两个或多个发电机功能产生的输出的笛卡尔积
我希望itertools.product不要阻塞,而是在生成器输入函数引发StopIteration之前给mr第一个产品元素。
有没有提供类似的功能?
我写了一个简单的程序来演示我的问题:
#!/usr/bin/python
import time
import itertools
def g_delay(l, delay):
for i in range(l):
yield i
time.sleep(delay)
def g(l):
for i in range(l):
yield i
if __name__ == "__main__":
start_time = time.time()
p = itertools.product(g_delay(2,1), g_delay(3,1))
elapsed_time = time.time() - start_time
print '%f' % elapsed_time
for i in p:
print i
print
start_time = time.time()
p = itertools.product(g(2), g(3))
elapsed_time = time.time() - start_time
print '%f' % elapsed_time
for i in p:
print i
输出:
5.004710
(0, 0)
(0, 1)
(0, 2)
(1, 0)
(1, 1)
(1, 2)
0.000017
(0, 0)
(0, 1)
(0, 2)
(1, 0)
(1, 1)
(1, 2)
我希望得到的结果是,5.004710秒的第一个延迟类似于后者(0.000017),并且在访问产品元素时(在for循环中)发生阻塞。
答案 0 :(得分:1)
这是一个产品版本(仅适用于两个迭代器),它们尽可能地变得懒惰。
def product(i1, i2):
for a in i1:
j2, i2 = itertools.tee(i2)
for b in j2:
yield (a, b)