Voici un itérateur (precomputing_iterator
) qui prend un itérateur (sample_iterator
) comme entrée. precomputing_iterator
précalcul les valeurs de retour de sample_iterator
. Lorsque precomputing_iterator
est créé, le pré-calcul des valeurs de retour de sample_iterator
est démarré immédiatement. Les valeurs renvoyées sont enregistrées sur un objet multiprocessing.Queue
. S'il y a des valeurs dans la file d'attente, precomputing_iterator
peut les donner immédiatement.
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
Ici, pour moi, le premier temps d'exécution est de 1,4 secondes (la file d'attente est vide, aucune valeur de retour précalculée). Le deuxième temps d'exécution est 0,00031 secondes (le résultat précalculé est juste retourné)
s'il vous plaît dites-moi pourquoi la question n'est pas claire, de sorte que je peux éditer et l'améliorer, en votant vers le bas! –