2014-05-12 62 views
1

我需要構建由兩個或多個發電機功能實時產生的輸出的笛卡爾乘積。
我希望itertools.product不要阻塞,而是在生成器輸入函數引發StopIteration之前爲mr提供第一個產品元素。
有沒有提供這樣的功能?當使用發電機作爲參數時,itertools產品塊

我寫了一個簡單的程序來證明我的問題:

#!/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

你做*不*需要在一個生成器函數中引發StopIteration; Python爲你照顧。 –

+0

我真的不知道你想要實現什麼...... –

+0

謝謝我不知道 – user3248533

回答

1

下面是一個產品的版本(只有兩個迭代器),它試圖儘可能地使用懶惰。

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

非常感謝,正是我想要的 – user3248533