imap
/ imap_unordered
Ve 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.
map
yinelemeyi 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.
imap
verdiğ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, chunksize
varsayılan değer olan 1'den daha büyük bir argüman iletilerek hafifletilebilir .
Arasındaki diğer önemli fark imap
/ imap_unordered
ve map
/ map_async
ile 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
, AsyncResult
hemen 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
( map
aslı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.
imap
ve imap_unordered
her 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_unordered
Bunun 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.map
Veya 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_unordered
over 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.