कई numpy गणना जीआईएल द्वारा अप्रभावित हैं, लेकिन सभी नहीं।
कोड में जबकि पाइथन दुभाषिया (उदाहरण के लिए सी पुस्तकालय) की आवश्यकता नहीं है, विशेष रूप से जीआईएल को छोड़ना संभव है - अन्य कोड को अनुमति देना जारी रखने के लिए दुभाषिया पर निर्भर करता है। Numpy सी कोडबेस में मैक्रोज़ NPY_BEGIN_THREADS
और NPY_END_THREADS
का उपयोग जीआईएल रिलीज की अनुमति देने वाले कोड के ब्लॉक को सीमित करने के लिए किया जाता है। आप इन्हें this search of the numpy source में देख सकते हैं।
NumPy C API documentation में थ्रेडिंग समर्थन पर अधिक जानकारी है। अतिरिक्त मैक्रोज़ NPY_BEGIN_THREADS_DESCR
, NPY_END_THREADS_DESCR
और NPY_BEGIN_THREADS_THRESHOLDED
पर ध्यान दें जो सशर्त जीआईएल रिलीज को संभालते हैं, जो dtypes
और लूप के आकार पर निर्भर करता है।
सबसे प्रमुख कार्यों को जारी जीआईएल - उदाहरण के Universal Functions (ufunc) के लिए बहुत as described कार्य करें:
जब तक कोई वस्तु सरणियों शामिल कर रहे हैं, अजगर वैश्विक दुभाषिया लॉक (जीआईएल) छोरों बुला से पहले जारी किया गया है। त्रुटि शर्तों को संभालने के लिए आवश्यक होने पर इसे फिर से अधिग्रहित किया जाता है।
अपने कोड के संबंध में, source code for NumPy is available। उपरोक्त मैक्रोज़ के लिए आपके द्वारा उपयोग किए जाने वाले कार्यों (और वे जिन्हें वे कॉल करते हैं) देखें। ध्यान दें कि प्रदर्शन लाभ पर बहुत निर्भर है कि जीआईएल जारी किया गया है - यदि आपका कोड लगातार पाइथन में/बाहर निकल रहा है तो आपको अधिक सुधार दिखाई नहीं देगा।
दूसरा विकल्प बस इसका परीक्षण करना है। हालांकि, ध्यान रखें कि सशर्त जीआईएल मैक्रोज़ का उपयोग करने वाले कार्यों में छोटे और बड़े सरणी के साथ विभिन्न व्यवहार प्रदर्शित हो सकते हैं। इसलिए एक छोटे से डेटासेट के साथ एक परीक्षण बड़े कार्य के लिए प्रदर्शन का सटीक प्रतिनिधित्व नहीं हो सकता है।
numpy उपलब्ध on the official wiki के साथ समांतर प्रसंस्करण पर कुछ अतिरिक्त जानकारी है और सामान्य over on Programmers.SE में पाइथन जीआईएल के बारे में उपयोगी पोस्ट है।
धन्यवाद, यह वास्तव में उपयोगी उत्तर है! – Lisa