ここ入力としてイテレータ(sample_iterator
)かかりイテレータ(precomputing_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秒です(キューは空です。戻り値はあらかじめ計算されていません)。 2回目の実行時間は0.00031秒です(事前計算結果が返されます)
質問がなぜ不明であるのか教えてください。私はそれを編集して改善することができます。 –