我有一个python迭代器,每次迭代都能解决一个耗时的任务。如果迭代器的返回值可以在后台预先计算,这样当调用迭代器时,可以立即生成结果,那就太好了。
例如
import numpy as np
def sample_iterator():
while True:
x = np.random.rand(int(1e8)).mean()
yield x
这是一个迭代器 (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 秒(刚刚返回预计算结果(