यदि आप क्रमपरिवर्तन जनरेटर से आइटम के साथ काम करना चाहते हैं तो सीपीयू गहन है, तो आप शायद धागे की बजाय प्रक्रियाओं का उपयोग करना चाहते हैं। सीपीथॉन का ग्लोबल इंटरप्रेटर लॉक (जीआईएल) सीपीयू बाध्य काम करते समय सीमित मूल्य के बहुप्रचार को बनाता है।
इसके बजाय, इसलिए जैसे multiprocessing
मॉड्यूल के Pool
वर्ग, का उपयोग करें:
import multiprocessing
import itertools
def do_stuff(perm):
# whatever
return list(reversed(perm))
if __name__ == "__main__":
with multiprocessing.Pool() as pool: # default is optimal number of processes
results = pool.map(do_stuff, itertools.permutations('1234', r=4))
# do stuff with results
ध्यान दें कि आप results
से अधिक पुनरावृत्ति हो जाएगा अगर (बजाय एक सूची के रूप में यह साथ कुछ कर), तो आपको imap
के बजाय का उपयोग कर सकते map
एक पुनरावर्तक प्राप्त करने के लिए जिसका उपयोग आप परिणामों पर काम करने के लिए कर सकते हैं क्योंकि वे कार्यकर्ता प्रक्रियाओं से उत्पादित होते हैं। यदि इससे कोई फ़र्क नहीं पड़ता कि आइटम किस प्रकार लौटाए जाते हैं, तो आप imap_unordered
(मुझे लगता है) का उपयोग कुछ स्मृति को सहेजने के लिए कर सकते हैं।
if __name__ is "__main__"
बॉयलरप्लेट विंडोज़ पर आवश्यक है, जहां multiprocessing
मॉड्यूल को ओएस की सीमाओं के आसपास काम करना है (fork
)।
आप थ्रेड के बीच डेटा को कैसे विभाजित करना चाहते हैं? आप एकाधिक धागे का उपयोग क्यों करना चाहते हैं? –
मैं इसे समान रूप से विभाजित करना चाहता हूं: यदि 'परम्स' में 1'000'000 प्रविष्टियां हैं और मेरे पास 4 धागे हैं तो प्रत्येक धागे को 250'000 प्रविष्टियों को संसाधित करना चाहिए; अगर मैं केवल एक थ्रेड का उपयोग करता हूं तो पूरे प्रविष्टियों के माध्यम से लगभग 10 मिनट लगते हैं इसलिए मैं एक से अधिक धागे – wasp256
का उपयोग करना चाहता हूं, आपकी प्रक्रिया बिल्कुल ठीक है, आईओ बाध्य या सीपीयू बाध्य है? –