2012-07-05 14 views
28

Próbuję nauczyć się korzystać z pakietu wieloprocesorowego Pythona, ale nie rozumiem różnicy między map i imap.Python Multiprocessing: Jaka jest różnica między mapą a imapem?

Czy różnica oznacza, że ​​map zwraca, powiedzmy, faktyczną tablicę lub zbiór, podczas gdy imap zwraca iterator przez tablicę lub zbiór? Kiedy będę używał jednego nad drugim?

Ponadto nie rozumiem, o co chodzi w tym argumencie. Czy jest to liczba wartości przekazywanych do każdego procesu?

+1

Ściśle związane: [multiprocessing.pool: Jaka jest różnica między map_async a imap?] (Http://stackoverflow.com/questions/26520781/multiprocessing-pool-whats-the-difference-between-map-async-and -imap/26521507 # 26521507) – dano

Odpowiedz

25

Taka jest różnica. Jednym z powodów, dla których możesz użyć narzędzia imap zamiast map, jest to, że chcesz rozpocząć przetwarzanie pierwszych kilku wyników, nie czekając na wyliczenie reszty. mapa czeka na każdy wynik przed powrotem.

Czasem wydajniejsze jest dzielenie pracy w większych ilościach, ponieważ za każdym razem, gdy pracownik żąda więcej pracy, narzuca się IPC i synchronizację.

+0

A zatem, w jaki sposób można podejść do rozsądnej wartości dla segmentu? Jeśli większy oznacza mniej IPC i koszty związane z synchronizacją z powodu trawienia, to jaki jest kompromis? (dlaczego wybór "chunksize == len (iterable)" jest złym pomysłem, czy jest to?) –

+0

@Adam Jeśli wybierzesz 'chunksize = len (iterable)', wszystkie zadania zostaną przypisane do jednego procesu! 'len (iterable) // numprocesses' to maksimum, które jest użyteczne. Kompromis między obciążeniem synchronizacji a wykorzystaniem procesora (duże porcje spowodują, że niektóre procesy zakończą się przed innymi, marnując potencjalny czas przetwarzania). – Antimony

+0

Ok, widzę to, ale to po prostu oznacza, że ​​wybieranie rozsądnej części sprowadza się do prób i błędów na danych w konkretnym ustawieniu? –

0

IMAP z modułu itertools, który służy do szybkiego i pamięci wydajności w python.Map będzie powrotu listę gdzie IMAP zwraca się obiekt który wytwarza wartości dla każdej iteracji (w pytona 2,7) .Powierzchnia poniżej bloki kodu usuwają różnicę.

Mapa powraca lista może być drukowana bezpośrednio

from itertools import * 
    from math import * 

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

IMAP powraca przedmiot, który jest przekształcany do listy i wydrukowany.

from itertools import * 
from math import * 

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

Chunksize będzie iterowalny być podzielone na odcinki o określonej wielkości (w przybliżeniu) i każdy kawałek jest przedstawiony jako oddzielny zadania.

Powiązane problemy