2017-08-01 3 views
-2

J'ai un itérateur python qui résout une tâche fastidieuse à chaque itération. Il serait bien que les valeurs de retour de l'itérateur puissent être précalculées en arrière-plan, de telle sorte que lorsque l'itérateur est appelé, le résultat peut être obtenu immédiatement.itérateur Python qui précompute le retour (enqueue)

par exemple

import numpy as np 

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

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! –

Répondre

1

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é)