Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
预计算返回的Python迭代器(排队)_Python_Iterator_Queue_Multiprocessing_Yield - Fatal编程技术网

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

预计算返回的Python迭代器(排队),python,iterator,queue,multiprocessing,yield,Python,Iterator,Queue,Multiprocessing,Yield,我有一个python迭代器,每次迭代都会解决一个耗时的任务。如果迭代器的返回值可以在后台预计算,这样在调用迭代器时,就可以立即生成结果,那就太好了 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 d

我有一个python迭代器,每次迭代都会解决一个耗时的任务。如果迭代器的返回值可以在后台预计算,这样在调用迭代器时,就可以立即生成结果,那就太好了

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
乙二醇

这里是一个迭代器(
预计算迭代器
),它将迭代器(
示例迭代器
)作为输入<代码>预计算迭代器预计算
示例迭代器
的返回值。创建
预计算迭代器
时,立即开始对
示例迭代器
的返回值进行预计算。返回值保存在
多处理.Queue
对象上。如果队列中有值,
预计算迭代器
可以立即生成它们

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

请告诉我问题不清楚的原因,以便我在投票否决时对其进行编辑和改进!