imap
/ imap_unordered
और map
/ के बीच दो प्रमुख अंतर हैं map_async
:
- जिस तरह से वे आपके द्वारा पास किए जाने वाले चलने योग्य का उपभोग करते हैं।
- जिस तरह से वे परिणाम वापस आपके पास लौटाते हैं।
map
एक सूची के लिए चलने योग्य परिवर्तित करके (यह पहले से ही एक सूची नहीं है), इसे विखंडू में तोड़कर और उन विखंडू को कार्यकर्ता प्रक्रियाओं में भेजकर अपनी पुनरावृत्ति का उपभोग करता है Pool
। चेरों में चलने योग्य को तोड़कर प्रत्येक आइटम को एक समय में प्रक्रियाओं के बीच चलने योग्य से बेहतर प्रदर्शन करता है - विशेषकर यदि यह चलने योग्य बड़ा है। हालाँकि, इसे चेंक करने के लिए पुनरावृति को एक सूची में बदलना, इसकी बहुत अधिक मेमोरी लागत हो सकती है, क्योंकि पूरी सूची को मेमोरी में रखना होगा।
imap
आप इसे एक सूची में देने वाले चलने योग्य नहीं बदलते हैं, और न ही इसे विखंडू में (डिफ़ॉल्ट रूप से) तोड़ते हैं। यह एक समय में चलने योग्य एक तत्व पर पुनरावृति करेगा, और प्रत्येक को एक कार्यकर्ता प्रक्रिया में भेज देगा। इसका मतलब यह है कि आप पूरे चलने योग्य को किसी सूची में बदलने की मेमोरी हिट नहीं लेते हैं, लेकिन इसका अर्थ यह भी है कि चॉन्किंग की कमी के कारण प्रदर्शन बड़े पुनरावृत्तियों के लिए धीमा है। chunksize
हालाँकि, यह 1 के डिफ़ॉल्ट से बड़े तर्क को पारित करके कम किया जा सकता है ।
imap
/ imap_unordered
और map
/ के बीच अन्य प्रमुख अंतर map_async
यह है कि imap
/ के साथ imap_unordered
, आप श्रमिकों से परिणाम प्राप्त करना शुरू कर सकते हैं जैसे ही वे तैयार होते हैं, बल्कि उन सभी के समाप्त होने की प्रतीक्षा करने के बजाय। के साथ map_async
, AsyncResult
इसे तुरंत लौटा दिया जाता है, लेकिन आप वास्तव में उस ऑब्जेक्ट से परिणाम प्राप्त नहीं कर सकते हैं जब तक कि उन सभी को संसाधित नहीं किया जाता है, जिस बिंदु पर यह वही सूची देता है जो वास्तव में map
( map
आंतरिक रूप से आंतरिक रूप से लागू होता है map_async(...).get()
)। आंशिक परिणाम प्राप्त करने का कोई तरीका नहीं है; आपके पास या तो पूरा परिणाम है, या कुछ भी नहीं है।
imap
और imap_unordered
दोनों पुनरावृत्तियों को तुरंत लौटाते हैं। इसके साथ imap
, परिणाम तैयार होते ही पुनरावृति से प्राप्त होंगे, जबकि इनपुट के क्रम को संरक्षित करते हुए। imap_unordered
परिणाम के साथ , जैसे ही वे तैयार होंगे, परिणाम प्राप्त किए जाएंगे, भले ही इनपुट के क्रम के अनुसार। तो, मान लीजिए कि आपके पास यह है:
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)))
यह आउटपुट होगा:
3 (Time elapsed: 1s)
7 (Time elapsed: 5s)
5 (Time elapsed: 5s)
यदि आप p.imap_unordered
इसके बजाय उपयोग करते हैं p.imap
, तो आप देखेंगे:
3 (Time elapsed: 1s)
5 (Time elapsed: 3s)
7 (Time elapsed: 5s)
यदि आप उपयोग करते हैं p.map
या p.map_async().get()
, आप देखेंगे:
3 (Time elapsed: 5s)
7 (Time elapsed: 5s)
5 (Time elapsed: 5s)
तो, उपयोग करने के लिए प्राथमिक कारण imap
/ imap_unordered
अधिक map_async
हैं:
- आपकी पुनरावृत्ति काफी बड़ी है जो इसे एक सूची में परिवर्तित करने के कारण आपको बहुत अधिक मेमोरी से बाहर निकलने / उपयोग करने का कारण बनेगी।
- आप उन सभी को पूरा करने से पहले परिणामों को संसाधित करने में सक्षम होना चाहते हैं।