预先计算返回的Python迭代器(入队)

时间:2017-08-01 13:26:14

标签: python iterator queue multiprocessing yield

我有一个python迭代器,每次迭代都能解决一个耗时的任务。如果迭代器的返回值可以在后台预先计算,那么当调用迭代器时,结果可以立即生成。

例如

import numpy as np

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

1 个答案:

答案 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秒(刚刚返回预先计算的结果)