2017-08-01 20 views
-2

私は時間のかかる作業を各繰り返しで解決するPythonイテレータを用意しています。イテレータの戻り値がバックグラウンドであらかじめ計算されていれば、イテレータが呼び出されたときに結果がすぐに返されるようにするといいでしょう。return(enqueue)を事前計算するPythonイテレータ

例えば

import numpy as np 

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

質問がなぜ不明であるのか教えてください。私はそれを編集して改善することができます。 –

答えて

1

ここ入力としてイテレータ(sample_iterator)かかりイテレータ(precomputing_iterator)です。 precomputing_iteratorsample_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秒です(事前計算結果が返されます)

関連する問題