這裏是一個迭代(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秒(預計算結果僅返回)
請告訴我爲什麼問題不清楚,以便我可以在投票時對其進行編輯和改進! –