我有一个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秒(刚刚返回预先计算的结果)