अपने कोड का विश्लेषण करने और यह पता लगाने के लिए कि यह सबसे अधिक या सबसे कम कुशल कहां है, इन युक्तियों का उपयोग करें।
चूंकि पायथन में "इसे करने के एक से अधिक तरीके हैं", कुछ कार्यों के लिए सबसे मेमोरी-कुशल दृष्टिकोण ढूंढना चुनौतीपूर्ण हो सकता है। यहीं पर एक मेमोरी प्रोफाइलर मदद कर सकता है। लीक पर नज़र रखने के साथ-साथ, आपके कोड की मेमोरी प्रोफ़ाइल का अनुमान लगाने से यह निर्धारित करने में मदद मिलती है कि कौन सा कोड मेमोरी-कुशल है।
चाहे आप मशीन लर्निंग मॉडल या पायथन के साथ एक वेबसाइट विकसित कर रहे हों, आप स्क्रिप्ट, व्यक्तिगत कोड लाइनों या फ़ंक्शंस के लिए मेमोरी प्रोफ़ाइल का अनुमान लगा सकते हैं।
आपके संपूर्ण कोड बेस की मेमोरी प्रोफ़ाइल का अनुमान लगाना अव्यावहारिक हो सकता है, क्योंकि यह आपके एप्लिकेशन को काफी धीमा कर सकता है। यह सबसे अच्छा है कि आप चुनिंदा फ़ंक्शंस या विधियों को प्रोफ़ाइल करें जिनके बारे में आपको संदेह है कि वे अधिक मेमोरी का उपभोग कर रहे हैं। लेकिन अगर आप इसे अपने पूरे एप्लिकेशन के लिए करना चाहते हैं, तो भी आप इसे संभालने के लिए एक अलग मॉड्यूल समर्पित करना चाह सकते हैं।
पायथन में कई प्रोफाइलिंग लाइब्रेरी हैं। कुछ सबसे लोकप्रिय हैं
मेमोरी_प्रोफाइलर, psutil, ट्रेसमैलोक, और पिम्पलर. यह ट्यूटोरियल उपयोग करता है मेमोरी_प्रोफाइलर और psutil.जबकि psutil किसी विधि या फ़ंक्शन निष्पादन की कुल मेमोरी खपत का अनुमान लगाने के लिए आदर्श है, मेमोरी_प्रोफाइलर समय के साथ लाइन-बाय-बाय और कार्यात्मक स्तर के उपयोग के रुझान सहित अधिक विस्तृत मेमोरी उपयोग जानकारी देता है।
आरंभ करने के लिए, इंस्टॉल करें मेमोरी_प्रोफाइलर आपके पायथन वर्चुअल वातावरण में। ये भी इंस्टॉल होता है psutil.
पिप मेमोरी_प्रोफाइलर स्थापित करें
मेमोरी में किसी ऑब्जेक्ट का आकार प्राप्त करें
आप पहले उस ऑब्जेक्ट के आकार की गणना करके अपनी मेमोरी प्रोफाइलिंग शुरू कर सकते हैं जिसे आप मेमोरी में उपयोग करना चाहते हैं।
इस प्रकार की प्रोफ़ाइलिंग विकास की शुरुआत में सहायक होती है - यह निर्धारित करने का प्रयास करते समय कि किसी प्रोग्राम में किस ऑब्जेक्ट प्रकार का उपयोग किया जाए।
उदाहरण के लिए, यदि आप यह तय करने में अटक जाते हैं कि किसी कार्य को प्राप्त करने के लिए कौन सी विधियों का उपयोग करना है, तो कहें, उपयुक्त पायथन डेटा प्रकार, आप यह निर्धारित करने के लिए बाइट्स में प्रत्येक का आकार प्राप्त कर सकते हैं कि आपके उपयोग के लिए कौन सा अधिक हल्का है मामला।
sys.getsizeof अंतर्निहित विधि यहां काम आती है:
आयात sys
प्रिंट(एफ" सूची का आकार: {sys.getsizeof([])} बाइट्स")
प्रिंट(f"शब्दकोश का आकार: {sys.getsizeof (dict)} बाइट्स")
प्रिंट(एफ"टुपल आकार: {sys.getsizeof(())} बाइट्स")
प्रिंट(एफ"सेट आकार: {sys.getsizeof({})} बाइट्स")
यहाँ आउटपुट है:
आप भी उपयोग कर सकते हैं sys.getsizeof बिल्ट-इन और कस्टम फ़ंक्शन के मेमोरी आकार की तुलना करने की विधि।
उदाहरण के लिए, इस कस्टम लंबाई फ़ंक्शन की तुलना करें लूप के लिए पायथन का उपयोग करता है अंतर्निर्मित के साथ लेन समारोह:
आयात sys
डीईएफ़लम्बाई प्राप्त करें(पुनरावर्तनीय):
गिनती = 0के लिए मैं में पुनरावर्तनीय:
गिनती +=1वापस करना गिनती करना
प्रिंट(f"अंतर्निहित लंबाई फ़ंक्शन: {sys.getsizeof (len)} बाइट्स")
प्रिंट(f"कस्टम लंबाई फ़ंक्शन: {sys.getsizeof (getLength)} बाइट्स")
उपरोक्त कोड निम्नलिखित आउटपुट देता है:
हालाँकि, जबकि sys.getsizeof मेमोरी में किसी ऑब्जेक्ट के आकार को मापता है, यह केवल ऑब्जेक्ट को ही ध्यान में रखता है, न कि उसे संदर्भित करने वालों को। उसके लिए, आपको अधिक विस्तृत प्रोफ़ाइलिंग विधि की आवश्यकता होगी।
पायथन फ़ंक्शन की मेमोरी प्रोफ़ाइल ढूंढें
आप इसका उपयोग करके किसी फ़ंक्शन की प्रत्येक कोड लाइन की अधिक विस्तृत मेमोरी प्रोफ़ाइल प्राप्त कर सकते हैं मेमोरी_प्रोफाइलर पैकेट। इसमें जोड़ना शामिल है @प्रोफ़ाइल आपके कार्य या विधि के लिए सज्जाकार:
पांडा आयात करें
सुन्न आयात करें
मेमोरी_प्रोफाइलर से प्रोफ़ाइल आयात करेंवर्ग हेरफेर:
@प्रोफ़ाइल
डीईएफ़ मैनिपुलेटडेटा (स्वयं):
डीएफ = पांडा. डेटा ढांचा({
'ए':[0, 3, numpy.nan, 10, 3, numpy.nan],
'बी': [numpy.nan, "पांडा", numpy.nan, "पांडा", "पायथन", "जावास्क्रिप्ट"],
})df.fillna (विधि='बीफिल', इनप्लेस=ट्रू)
df.fillna (विधि = 'फ़िल', इनप्लेस = सत्य)
रिटर्न स्ट्र (डीएफ)
मैनिप = मैनिप्युलेट()
प्रिंट करें (manip.manipulatorData())
उपरोक्त कोड फ़ंक्शन में कोड की प्रत्येक पंक्ति की विस्तृत मेमोरी प्रोफ़ाइल देता है जैसा कि दिखाया गया है:
मेम उपयोग कॉलम एक विशेष कोड लाइन के लिए मेमोरी उपयोग को इंगित करता है, जबकि वेतन वृद्धि कॉलम प्रत्येक पंक्ति द्वारा योगदान किए गए ओवरहेड को दर्शाता है। घटना कॉलम यह परिभाषित करता है कि कोड लाइन कितनी बार मेमोरी आवंटित करती है या हटाती है।
उदाहरण के लिए, उपरोक्त आउटपुट में, लाइन 11 0.1 एमआईबी (मेबीबाइट) की मेमोरी वृद्धि के साथ दो बार आई, जिससे मेमोरी उपयोग 55.4 एमआईबी तक बढ़ गया। लाइन्स 19 और 22 ने भी क्रमशः 0.2 एमआईबी और 0.3 एमआईबी का योगदान दिया, जिससे कुल मेमोरी उपयोग 55.9 एमआईबी हो गया।
टाइमस्टैम्प द्वारा पायथन स्क्रिप्ट की मेमोरी प्रोफ़ाइल ढूंढें
आप इसका उपयोग करके संपूर्ण पायथन स्क्रिप्ट की मेमोरी प्रोफ़ाइल का अनुमान भी लगा सकते हैं मेमोरी_प्रोफाइलर चलाकर mprof दिखाए गए अनुसार टर्मिनल में कमांड:
mprof स्क्रिप्ट_नाम.py चलाएँ
उपरोक्त आदेश प्रत्येक 0.1 सेकंड में निर्दिष्ट स्क्रिप्ट का नमूना लेता है और स्वचालित रूप से एक बनाता है .वह अपनी वर्तमान प्रोजेक्ट निर्देशिका के अंदर फ़ाइल करें।
जो आंकड़े इस प्रकार हैं सदस्य नोटेशन एक विशिष्ट समय अंतराल पर पायथन लिपि की मेमोरी उपयोग प्रोफ़ाइल हैं। दाईं ओर के अंतिम आंकड़े प्रत्येक मेमोरी उपयोग के लिए प्रोफाइलर द्वारा कैप्चर किए गए टाइमस्टैम्प का प्रतिनिधित्व करते हैं।
आप मेमोरी प्रोफ़ाइल का एक प्लॉट भी प्राप्त कर सकते हैं. इसके इंस्टालेशन की आवश्यकता है matplotlib:
पाइप matplotlib स्थापित करें
एक बार इंस्टॉल हो जाने पर, चलाएँ mprof इस प्रकार आदेश दें:
mprof प्लॉट
इस मामले में आउटपुट यहां दिया गया है:
एक समर्पित पायथन फ़ाइल में स्क्रिप्ट मेमोरी प्रोफ़ाइल चलाएँ
हो सकता है कि आप अलग-अलग पायथन स्क्रिप्ट के लिए प्रोफ़ाइल बनाना चाहें। आप ऐसा कर सकते हैं एक समर्पित पायथन मॉड्यूल का उपयोग करना पायथन के माध्यम से उपप्रक्रिया.
इस तरह, आप अपने मेमोरी प्रोफाइलर को अपने कोड बेस से अलग कर सकते हैं और ग्राफ़ आउटपुट को स्थानीय रूप से सहेज सकते हैं:
आयात उपप्रक्रिया
उपप्रक्रिया.रन([
'एमप्रोफ़', 'दौड़ना', '--शामिल-बच्चे', 'missing.py'
])
# प्लॉट आउटपुट को स्थानीय रूप से सहेजें
उपप्रक्रिया.रन(['एमप्रोफ़', 'कथानक', '--आउटपुट=आउटपुट.jpg'])
स्क्रिप्ट की मेमोरी प्रोफ़ाइल को चलाने के लिए, आपको केवल उपरोक्त कोड वाली पायथन फ़ाइल को चलाने की आवश्यकता है। यह एक मेमोरी प्रोफ़ाइल प्लॉट उत्पन्न करता है (आउटपुट.jpg) फ़ाइल निर्देशिका में:
किसी फ़ंक्शन निष्पादन से प्रयुक्त मेमोरी की मात्रा ज्ञात करें
आप इसका उपयोग करके निष्पादन के दौरान किसी विधि या फ़ंक्शन की कुल मेमोरी प्रोफ़ाइल पा सकते हैं psutil पैकेट।
उदाहरण के लिए, पिछले को प्रोफ़ाइल करने के लिए पांडा डेटाफ़्रेम हेरफेर किसी अन्य पायथन फ़ाइल के अंदर विधि:
आयात psutil
आयात sys
आयात ओएस
sys.path.append (sys.path[0] + "/..")# अपनी पद्धति वाले वर्ग को आयात करें
से कुछकोड.गायब आयात चालाकी से काम निकालना# कक्षा को त्वरित करें
मैनिप = मैनिप्युलेट()प्रक्रिया = psutil. प्रक्रिया (os.getpid())
प्रारंभिक_मेमोरी = प्रक्रिया.मेमोरी_इन्फो().rss# लक्ष्य विधि चलाएँ:
manip.manipulatorData()
# निष्पादन के बाद मेमोरी जानकारी प्राप्त करें
फाइनल_मेमोरी = प्रोसेस.मेमोरी_इन्फो().आरएसएस
मेमोरी_खपत = अंतिम_मेमोरी - प्रारंभिक_मेमोरी
मेमोरी_कंस्यूम्ड_एमबी = मेमोरी_कंस्यूम्ड / (1024 * 1024)
प्रिंट(f"फ़ंक्शन द्वारा उपयोग की गई मेमोरी: {memory_consumed_mb:.2एफ} एमबी")
जैसा कि दिखाया गया है, उपरोक्त मेगाबाइट्स (एमबी) में विधि की कुल मेमोरी प्रोफ़ाइल का अनुमान लगाता है:
ज्यूपिटर नोटबुक में एक कोड लाइन की मेमोरी प्रोफ़ाइल ढूंढें
यदि आप ज्यूपिटर नोटबुक में iPython का उपयोग करते हैं, तो आप इसका उपयोग करके एक-लाइनर की मेमोरी प्रोफ़ाइल की गणना कर सकते हैं मेमोरी_प्रोफाइलर. आपको केवल लोड करने की आवश्यकता है मेमोरी_प्रोफाइलर एक कोशिका में. फिर जोड़ें %मेमिट बाद की कोशिकाओं में आपके कोड के लिए जादुई फ़ंक्शन; यह कोड की चरम मेमोरी और बढ़ा हुआ आकार लौटाता है।
यह विधि Jupyter Notebook में iPython के अलावा नियमित Python स्क्रिप्ट के साथ काम नहीं करती है।
उदाहरण के लिए:
आप भी उपयोग कर सकते हैं %मेमिट रनटाइम पर किसी फ़ंक्शन की मेमोरी को प्रोफ़ाइल करने के लिए जिप्टर नोटबुक में मैजिक फ़ंक्शन:
अपने पायथन कोड में अपनी मेमोरी दक्षता में सुधार करें
हेवी-ड्यूटी डेटा-लिफ्टिंग कार्यों को ध्यान में रखते हुए हम अक्सर पायथन का उपयोग करते हैं, प्रत्येक कोड लाइन को मेमोरी उपयोग को प्रबंधित करने के लिए पर्याप्त अनुकूलन की आवश्यकता होती है। जबकि पायथन में कई अंतर्निहित पायथन फ़ंक्शन हैं, गैर-संदर्भित ऑब्जेक्ट के परिणामस्वरूप मेमोरी लीक होती है।
यदि आप मेमोरी उपयोग पर विचार किए बिना अपने कोड बेस में काम करने वाले प्रत्येक पायथन सिंटैक्स को हटा रहे हैं, तो आप बहुत आगे जाने से पहले पीछे मुड़कर देखना चाहेंगे।