imap/ imap_unorderedVe map/ arasında iki temel fark vardır map_async:
- Onlara geçtiğiniz itibari tüketme biçimleri.
- Sonucu size geri döndürme şekilleri.
mapyinelemeyi bir listeye dönüştürerek (zaten bir liste olmadığı varsayılarak), parçaları parçalara bölerek ve bu parçaları içindeki işçi işlemlerine göndererek yinelenebilir Pool. Yinelenebilir öğelerin parçalara bölünmesi, her öğeyi yinelenen işlemler arasında, her seferinde bir öğe olmak üzere, özellikle de yinelenebilir büyükse, daha iyi performans gösterir. Bununla birlikte, parçalanabilmesi için tekrarlanabilir bir listeye dönüştürülmesi çok yüksek bir bellek maliyetine sahip olabilir, çünkü tüm listenin bellekte tutulması gerekecektir.
imapverdiğiniz yinelemeyi bir listeye dönüştürmez ya da parçalara ayırmaz (varsayılan olarak). Teker teker yinelenebilir bir öğe üzerinde yinelenecek ve her birini bir çalışan işlemine gönderecektir. Bu, tüm yinelenebilir bir listeyi dönüştürmek için bellek isabet almazsınız, ama aynı zamanda, parçalanma eksikliği nedeniyle performansın büyük yinelenebilirler için daha yavaş olduğu anlamına gelir. Ancak bu, chunksizevarsayılan değer olan 1'den daha büyük bir argüman iletilerek hafifletilebilir .
Arasındaki diğer önemli fark imap/ imap_unorderedve map/ map_asyncile yani imap/ imap_unordered, yakında oldukça bitirilmesi hepsi için beklemek zorunda daha, onlar hazır olduğunca işçilerden sonuçları almaya başlayabilirsiniz. İle map_async, AsyncResulthemen döndürülür, ancak hepsi işlenene kadar o nesneden sonuçları alamazsınız, bu noktalarda aynı listeyi döndürür map( mapaslında dahili olarak uygulanmaktadır map_async(...).get()). Kısmi sonuçlar almanın bir yolu yoktur; ya tüm sonuca sahipsiniz ya da hiçbir şey.
imapve imap_unorderedher ikisi de hemen tekrarlanabilir. İle imap, sonuçlar hazır olur olmaz yinelemeden elde edilirken, yine de girdinin sıralanabilirliğini korurken elde edilir. İle imap_unordered, sonuçlar, tekrarlanabilir girdinin sırasına bakılmaksızın hazır olur olmaz verilecektir. Yani, diyelim ki:
import multiprocessing
import time
def func(x):
time.sleep(x)
return x + 2
if __name__ == "__main__":
p = multiprocessing.Pool()
start = time.time()
for x in p.imap(func, [1,5,3]):
print("{} (Time elapsed: {}s)".format(x, int(time.time() - start)))
Bu çıktı:
3 (Time elapsed: 1s)
7 (Time elapsed: 5s)
5 (Time elapsed: 5s)
p.imap_unorderedBunun yerine kullanırsanız p.imapşunları görürsünüz:
3 (Time elapsed: 1s)
5 (Time elapsed: 3s)
7 (Time elapsed: 5s)
p.mapVeya kullanırsanız p.map_async().get()şunları görürsünüz:
3 (Time elapsed: 5s)
7 (Time elapsed: 5s)
5 (Time elapsed: 5s)
Bu nedenle, imap/ imap_unorderedover kullanmanın başlıca nedenleri map_async:
- Yinelemeniz, bir listeye dönüştürmenizde çok fazla bellek kalmaması / kullanılmasına neden olacak kadar büyüktür.
- Sen önce sonuçları işlemeye başlamak için mümkün istiyorum tüm bunlardan tamamlanır.