2012-07-05 19 views
28

Python'un çoklu işlem paketini kullanmayı öğrenmeye çalışıyorum, ancak map ve imap arasındaki farkı anlamıyorum.Python Çoklu işlem: Harita ve imap arasındaki fark nedir?

mapimap bir dizi üzerinde bir yineleyici döndürürken veya ayarlanmışken, gerçek bir dizi veya set döndürüyor mu? Ne zaman birini diğerinden kullanırdım?

Ayrıca, bende ne tür bir ifade olduğunu anlamıyorum. Her işlem için geçirilen değerlerin sayısı bu mu?

+1

Yakından ilgili: [multiprocessing.pool: map_async ve imap arasındaki fark nedir?] (Http://stackoverflow.com/questions/26520781/multiprocessing-pool-whats-the-difference-between-map-async-and -imap/26521507 # 26521507) – dano

cevap

25

Fark budur. Harita yerine imap kullanmanın bir nedeni, geri kalanının hesaplanmasını beklemeden ilk birkaç sonucu işlemeye başlamak istemiş olmanızdır. Harita, geri dönmeden önce her sonuç için bekler.

Parçalara gelince, daha büyük miktarlarda işi dole etmek daha verimli olur, çünkü çalışan daha fazla iş isterse, IPC ve senkronizasyon ek yükü vardır. Aşağıdaki

+0

Öyleyse, o zaman nasıl birşeyler için uygun bir değer belirleyen bir yaklaşım o zaman nasıl olur? Daha büyükse, dekapajdan dolayı IPC & sync ek yükünün daha az olması durumunda, tradeoff nedir? (yani neden "chunksize == len (yinelenebilir)" kötü bir fikir mi alıyorsunuz, yoksa budur?) –

+0

@Adam Eğer 'chunksize = len (yinelenebilir)' seçeneğini seçerseniz, tüm işler tek bir sürece atanacaktır! 'len (yinelenebilir) // numprocesses', yararlı olan maksimum değerdir. Tradeoff, senkronizasyon ek yükü ve cpu kullanımı arasındadır (büyük yığınlar, bazı işlemlerin diğerlerinden önce bitmesine ve potansiyel işlem süresi kaybına neden olacaktır). – Antimony

+0

Tamam, bunu görüyorum, ama bu sadece belirli bir ortamda belirli bir veri üzerinde deneme ve hata yapmak için makul bir yığın kaynaşmayı seçmek anlamına mı geliyor? –

0

IMAP listesini döndürür python.Map hızlı ve bellek verimliliği için kullanılan itertools modülünden olduğu, (piton 2.7 içinde) her etilmektedir üreten nesneyi döner IMAP gibi .bir Kod blokları farkı temizleyecektir.

ilk doğrudan doğruya

from itertools import * 
    from math import * 

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

IMAP döner liste dönüştürülür ve basılı olduğu nesne listesi yazdırılabilir döndürür.

from itertools import * 
from math import * 

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

ChunkSize iterable (yaklaşık), belirtilen boyutta parçalar halinde bölünmüş ve her parça ayrı bir görev olarak gönderilen yapacaktır.

İlgili konular