Dans quelle situation nous avons besoin d'utiliser les " multiprocessing.Piscine.imap_unordered`?
L'ordre des résultats de l'itérateur renvoyé de imap_unordered
est arbitraire, et il ne semble pas fonctionner plus vite que imap
(qui je vérifie avec le code suivant), alors pourquoi serait-on utiliser cette méthode?
from multiprocessing import Pool
import time
def square(i):
time.sleep(0.01)
return i ** 2
p = Pool(4)
nums = range(50)
start = time.time()
print 'Using imap'
for i in p.imap(square, nums):
pass
print 'Time elapsed: %s' % (time.time() - start)
start = time.time()
print 'Using imap_unordered'
for i in p.imap_unordered(square, nums):
pass
print 'Time elapsed: %s' % (time.time() - start)
- Dans cet exemple, la différence entre la quantité de temps nécessaire pour
0**2
n'est pas différent de49**2
. Je me demandais ce qui se passerait si certains calcul prend beaucoup plus de temps que les autres. Vaimap_unordered
être le plus rapide dans ce cas? - Je pense que oui.
Vous devez vous connecter pour publier un commentaire.
À l'aide de
pool.imap_unordered
au lieu depool.imap
n'aura pas un grand effet sur le temps total d'exécution de votre code. Il pourrait être un peu plus rapide, mais pas trop.Ce qu'elle peut faire, cependant, est de procéder à l'intervalle entre les valeurs disponibles dans vos itération de plus, même. C'est, si vous avez les opérations qui peuvent prendre très différentes quantités de temps (plutôt que de la cohérence de l'
0.01
secondes vous utilisiez dans votre exemple),imap_unordered
permet de lisser les choses par le rendement plus rapide des valeurs calculées à l'avance, de façon plus lente des valeurs calculées. Le régulierimap
retardera le rendement le plus rapide, jusqu'à ce que, après le ralentissement de celles à venir ont été calculés (mais cela ne veut pas retarder le processus de travail de passer à plus de calculs, juste le temps pour vous de voir).Essayez de faire votre travail en fonction sommeil pour
i*0.1
secondes, en déplaçant votre liste de saisie et d'impressioni
dans vos boucles. Vous serez en mesure de voir la différence entre les deuximap
versions. Voici ma version (lamain
de la fonction et de laif __name__ == '__main__'
standard est requis pour exécuter correctement sur Windows):La
imap
version de longues pauses, tandis que des valeurs comme l'49 sont traitées (en prenant 4,9 secondes), puis il va voler au-dessus d'un tas d'autres valeurs ont été calculées par les autres processus, alors que nous étions en attente de 49 à traiter). En revanche, laimap_unordered
boucle sera généralement pas une pause presque aussi long à la fois. Il aura de plus en plus fréquentes, mais de plus courte pause, et sa sortie aura tendance à être plus lisse.imap_unordered semble également d'utiliser moins de mémoire au fil du temps que imap. Au moins, c'est ce que j'ai vécu avec un itérateur sur des millions de choses.