当使用生成器作为参数时,itertools产品块

时间:2014-05-12 09:57:15

标签: python itertools

我需要动态构建由两个或多个发电机功能产生的输出的笛卡尔积 我希望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循环中)发生阻塞。

1 个答案:

答案 0 :(得分:1)

这是一个产品版本(仅适用于两个迭代器),它们尽可能地变得懒惰。

def product(i1, i2):
    for a in i1: 
        j2, i2 = itertools.tee(i2)
        for b in j2:
            yield (a, b)