2017-08-01 48 views
-2

我有一個python迭代器,它可以在每次迭代中解決耗時的任務。如果迭代器的返回值可以在後臺進行預先計算,那麼這樣會很好,這樣當迭代器被調用時,結果就可以立即生成。預計算返回(入隊)的Python迭代器

例如

import numpy as np 

def sample_iterator(): 
    while True: 
     x = np.random.rand(int(1e8)).mean() 
     yield x 
+0

請告訴我爲什麼問題不清楚,以便我可以在投票時對其進行編輯和改進! –

回答

1

這裏是一個迭代(precomputing_iterator),其採用迭代(sample_iterator)作爲輸入。 precomputing_iterator預先計算返回值sample_iterator。當創建precomputing_iterator時,返回值sample_iterator的預計算立即開始。返回值保存在multiprocessing.Queue對象上。如果隊列中有值,則precomputing_iterator可以立即生成它們。

from multiprocessing import Process, Queue 
import numpy as np 
import time 

def sample_iterator(): 
    while True: 
     x = np.random.rand(int(1e8)).mean() 
     yield x 

def precomputing_iterator(iterator, maxsize = 5): 

    def enqueue(q): 
     while True: 
      q.put(iterator.next()) 

    q = Queue(maxsize = maxsize) 
    p = Process(target=enqueue, args=(q,)) 
    p.start() 

    while True: 
     yield q.get() 

i1 = sample_iterator() 
i2 = precomputing_iterator(i1) 

t = time.time() 
i2.next() 
print "execution time:", time.time() - t 

time.sleep(3) 

t = time.time() 
i2.next() 
print "execution time:", time.time() - t 

這裏對我來說第一次執行時間是1.4秒(隊列是空的,沒有預先計算的返回值)。第二次執行時間爲0.00031秒(預計算結果僅返回)