web-dev-qa-db-fra.com

Python Multiprocessing: Quelle est la différence entre map et imap?

J'essaie d'apprendre à utiliser le package multiprocessing de Python, mais je ne comprends pas la différence entre map et imap.

La différence est que map renvoie, disons, un tableau ou un ensemble réel, tandis que imap renvoie un itérateur sur un tableau ou un ensemble? Quand devrais-je utiliser l'un sur l'autre?

De plus, je ne comprends pas quel est l'argument de la taille de bloc. Est-ce le nombre de valeurs transmises à chaque processus?

44
grautur

Voilà la différence. L'une des raisons pour lesquelles vous pouvez utiliser imap au lieu de map est si vous souhaitez commencer à traiter les premiers résultats sans attendre que le reste soit calculé. la carte attend chaque résultat avant de revenir.

Quant à la taille de bloc, il est parfois plus efficace de distribuer du travail en plus grandes quantités car chaque fois que le travailleur demande plus de travail, il y a IPC et des frais généraux de synchronisation.

36
Antimony

imap provient du module itertools qui est utilisé pour l'efficacité rapide et la mémoire en python.Map retourner la liste où imap retourne l'objet qui génère les valeurs pour chaque itération (dans python 2.7). Les blocs de code ci-dessous effaceront la différence.

La carte renvoie la liste peut être imprimée directement

 from itertools import *
    from math import *

    integers = [1,2,3,4,5]
    sqr_ints = map(sqrt, integers)
    print (sqr_ints)

imap renvoie un objet qui est converti en liste et imprimé.

from itertools import *
from math import *

integers = [1,2,3,4,5]
sqr_ints = imap(sqrt, integers)
print list(sqr_ints)

Chunksize fera l'itérable à diviser en morceaux de taille spécifiée (approximative) et chaque morceau est soumis comme une tâche distincte.

2
Chandan

Avec imap, les appels fourchus se font en parallèle, pas l'un après l'autre de manière séquentielle. Par exemple, ci-dessous, vous appuyez sur trois échanges pour obtenir des carnets de commandes. Au lieu d'appuyer sur l'échange 1, puis l'échange 2, puis l'échange 3 séquentiellement, les appels imap.pool ne sont pas bloquants et vont directement aux trois échanges pour récupérer les carnets de commandes dès que vous appelez.

from pathos.multiprocessing import ProcessingPool as Pool
pool = Pool().imap
self.pool(self.getOrderBook, Exchanges, Tickers)
0
user3761555