प्रोफाइलिंग टूल्स के साथ अपने पायथन कोड को कैसे अनुकूलित करें

Propha Ilinga Tulsa Ke Satha Apane Payathana Koda Ko Kaise Anukulita Karem



पायथन कोड प्रदर्शन को बढ़ाना डेवलपर्स के लिए एक मूल्यवान कौशल है। इस मामले में प्रोफाइलिंग उपकरण आवश्यक हैं और कोड प्रतिबंधों और अक्षमताओं का पता लगाने में सुविधा प्रदान करते हैं। यह आलेख पायथन कार्यक्रमों को बेहतर बनाने के लिए प्रोफाइलिंग टूल का उपयोग करने के तरीकों की जांच करता है। निष्पादन समय, मेमोरी खपत और आवृत्तियों के फ़ंक्शन कॉल की माप में महारत हासिल करके, हम सटीक रूप से सुधार कर सकते हैं।

प्रोफाइलिंग टूल्स के साथ पायथन कोड को अनुकूलित करना

प्रोफाइलिंग टूल के साथ पायथन कोड को अनुकूलित करने के लिए Google Colab की स्थापना करते हुए, हम Google Colab वातावरण की स्थापना करके शुरुआत करते हैं। यदि हम कोलाब में नए हैं, तो यह एक आवश्यक, शक्तिशाली क्लाउड-आधारित प्लेटफ़ॉर्म है जो ज्यूपिटर नोटबुक और पायथन लाइब्रेरी की एक श्रृंखला तक पहुंच प्रदान करता है। हम (https://colab.research.google.com/) पर जाकर और एक नया पायथन नोटबुक बनाकर Colab तक पहुंचते हैं।

प्रोफाइलिंग लाइब्रेरी आयात करें

हमारा अनुकूलन प्रोफाइलिंग पुस्तकालयों के कुशल उपयोग पर निर्भर करता है। इस संदर्भ में दो महत्वपूर्ण पुस्तकालय सीप्रोफाइल और लाइन_प्रोफाइलर हैं।







आयात सीप्रोफ़ाइल

आयात लाइन_प्रोफाइलर

'सीप्रोफाइल' लाइब्रेरी प्रोफाइलिंग कोड के लिए एक अंतर्निहित पायथन टूल है, जबकि 'लाइन_प्रोफाइलर' एक बाहरी पैकेज है जो हमें लाइन दर लाइन कोड का विश्लेषण करते हुए और भी गहराई तक जाने की अनुमति देता है।



इस चरण में, हम एक पुनरावर्ती फ़ंक्शन का उपयोग करके फाइबोनैचि अनुक्रम की गणना करने के लिए एक नमूना पायथन स्क्रिप्ट बनाते हैं। आइए इस प्रक्रिया का अधिक गहराई से विश्लेषण करें। फाइबोनैचि अनुक्रम संख्याओं का एक समूह है जिसमें प्रत्येक क्रमिक संख्या उसके पहले की दो संख्याओं का योग होती है। यह आमतौर पर 0 और 1 से शुरू होता है, इसलिए अनुक्रम 0, 1, 1, 2, 3, 5, 8, 13, 21, इत्यादि जैसा दिखता है। यह एक गणितीय अनुक्रम है जिसे आमतौर पर इसकी पुनरावर्ती प्रकृति के कारण प्रोग्रामिंग में एक उदाहरण के रूप में उपयोग किया जाता है।



हम पुनरावर्ती फाइबोनैचि फ़ंक्शन में 'फाइबोनैचि' नामक एक पायथन फ़ंक्शन को परिभाषित करते हैं। यह फ़ंक्शन अपने तर्क के रूप में एक 'एन' पूर्णांक लेता है, जो फाइबोनैचि अनुक्रम में उस स्थिति का प्रतिनिधित्व करता है जिसे हम गणना करना चाहते हैं। हम फाइबोनैचि अनुक्रम में पांचवीं संख्या का पता लगाना चाहते हैं, उदाहरण के लिए, यदि 'एन' 5 के बराबर है।





डीईएफ़ फाइबोनैचि ( एन ) :

इसके बाद, हम एक बेस केस स्थापित करते हैं। रिकर्सन में बेस केस एक ऐसा परिदृश्य है जो कॉल को समाप्त करता है और एक पूर्व निर्धारित मान लौटाता है। फाइबोनैचि अनुक्रम में, जब 'एन' 0 या 1 होता है, तो हमें परिणाम पहले से ही पता होता है। 0वीं और पहली फाइबोनैचि संख्याएँ क्रमशः 0 और 1 हैं।

अगर एन <= 1 :

वापस करना एन

यह 'if' कथन यह निर्धारित करता है कि 'n' 1 से कम है या उसके बराबर है। यदि ऐसा है, तो हम 'n' को ही वापस कर देते हैं, क्योंकि आगे पुनरावृत्ति की कोई आवश्यकता नहीं है।



पुनरावर्ती गणना

यदि 'n' 1 से अधिक है, तो हम पुनरावर्ती गणना के साथ आगे बढ़ते हैं। इस मामले में, हमें '(n-1)'वें और '(n-2)'वें फाइबोनैचि संख्याओं को जोड़कर 'n'-वें फाइबोनैचि संख्या को खोजने की आवश्यकता है। हम फ़ंक्शन के भीतर दो पुनरावर्ती कॉल करके इसे प्राप्त करते हैं।

अन्य :

वापस करना फाइबोनैचि ( एन - 1 ) + फाइबोनैचि ( एन - 2 )

यहां, 'फाइबोनैचि(n - 1)' '(n-1)'वें फाइबोनैचि संख्या की गणना करता है, और 'फाइबोनैचि(n - 2)' '(n-2)'वें फाइबोनैचि संख्या की गणना करता है। हम 'n' स्थिति पर वांछित फाइबोनैचि संख्या प्राप्त करने के लिए इन दो मानों को जोड़ते हैं।

संक्षेप में, यह 'फाइबोनैचि' फ़ंक्शन समस्या को छोटी उप-समस्याओं में तोड़कर फाइबोनैचि संख्याओं की पुनरावर्ती गणना करता है। यह तब तक पुनरावर्ती कॉल करता है जब तक कि यह आधार मामलों (0 या 1) तक नहीं पहुंच जाता, ज्ञात मान लौटा देता है। किसी अन्य 'एन' के लिए, यह '(एन-1)' और '(एन-2)' के लिए दो पुनरावर्ती कॉलों के परिणामों को जोड़कर फाइबोनैचि संख्या की गणना करता है।

हालांकि यह कार्यान्वयन फाइबोनैचि संख्याओं की गणना करने के लिए सरल है, लेकिन यह सबसे कुशल नहीं है। बाद के चरणों में, हम बेहतर निष्पादन समय के लिए इसके प्रदर्शन प्रतिबंधों को पहचानने और अनुकूलित करने के लिए प्रोफाइलिंग टूल का उपयोग करेंगे।

कोड को CProfile के साथ प्रोफाइल करना

अब, हम 'cProfile' का उपयोग करके अपने 'फाइबोनैचि' फ़ंक्शन को प्रोफ़ाइल करते हैं। यह प्रोफ़ाइलिंग अभ्यास प्रत्येक फ़ंक्शन कॉल में लगने वाले समय की जानकारी प्रदान करता है।

cprofiler = सीप्रोफ़ाइल. प्रोफ़ाइल ( )

cprofiler. सक्षम ( )

परिणाम = फाइबोनैचि ( 30 )

cprofiler. अक्षम करना ( )

cprofiler. print_stats ( क्रम से लगाना = 'संचयी' )

इस सेगमेंट में, हम एक 'cProfile' ऑब्जेक्ट को इनिशियलाइज़ करते हैं, प्रोफाइलिंग को सक्रिय करते हैं, 'n=30' के साथ 'फाइबोनैचि' फ़ंक्शन का अनुरोध करते हैं, प्रोफाइलिंग को निष्क्रिय करते हैं, और संचयी समय के अनुसार क्रमबद्ध आंकड़े प्रदर्शित करते हैं। यह प्रारंभिक प्रोफ़ाइलिंग हमें एक उच्च-स्तरीय अवलोकन देती है कि कौन से कार्यों में सबसे अधिक समय लगता है।

! पिप इंस्टाल लाइन_प्रोफाइलर

आयात सीप्रोफ़ाइल

आयात लाइन_प्रोफाइलर

डीईएफ़ फाइबोनैचि ( एन ) :

अगर एन <= 1 :

वापस करना एन

अन्य :

वापस करना फाइबोनैचि ( एन - 1 ) + फाइबोनैचि ( एन - 2 )

cprofiler = सीप्रोफ़ाइल. प्रोफ़ाइल ( )

cprofiler. सक्षम ( )

परिणाम = फाइबोनैचि ( 30 )

cprofiler. अक्षम करना ( )

cprofiler. print_stats ( क्रम से लगाना = 'संचयी' )

अधिक विस्तृत विश्लेषण के लिए लाइन_प्रोफाइलर के साथ कोड लाइन को प्रोफाइल करने के लिए, हम अपने कोड लाइन को लाइन द्वारा विभाजित करने के लिए 'लाइन_प्रोफाइलर' का उपयोग करते हैं। 'लाइन_प्रोफाइलर' का उपयोग करने से पहले, हमें पैकेज को कोलाब रिपॉजिटरी में इंस्टॉल करना होगा।

! पिप इंस्टाल लाइन_प्रोफाइलर

अब जब हमारे पास 'लाइन_प्रोफाइलर' तैयार है, तो हम इसे अपने 'फाइबोनैचि' फ़ंक्शन पर लागू कर सकते हैं:

%load_ext लाइन_प्रोफाइलर

डीईएफ़ फाइबोनैचि ( एन ) :

अगर एन <= 1 :

वापस करना एन

अन्य :

वापस करना फाइबोनैचि ( एन - 1 ) + फाइबोनैचि ( एन - 2 )

%lprun -f फाइबोनैचि फाइबोनैचि ( 30 )

यह स्निपेट 'लाइन_प्रोफाइलर' एक्सटेंशन को लोड करने से शुरू होता है, हमारे 'फाइबोनैचि' फ़ंक्शन को परिभाषित करता है, और अंत में 'एन = 30' के साथ 'फाइबोनैचि' फ़ंक्शन को प्रोफाइल करने के लिए '%lprun' का उपयोग करता है। यह निष्पादन समय का एक पंक्ति-दर-पंक्ति विभाजन प्रदान करता है, जो सटीक रूप से साफ़ करता है कि हमारा कोड अपने संसाधनों को कहाँ खर्च करता है।

परिणामों का विश्लेषण करने के लिए प्रोफाइलिंग टूल चलाने के बाद, इसे आंकड़ों की एक श्रृंखला के साथ प्रस्तुत किया जाएगा जो हमारे कोड की प्रदर्शन विशेषताओं को दर्शाता है। इन आंकड़ों में प्रत्येक फ़ंक्शन के भीतर खर्च किया गया कुल समय और कोड की प्रत्येक पंक्ति की अवधि शामिल है। उदाहरण के लिए, हम यह अंतर कर सकते हैं कि फाइबोनैचि फ़ंक्शन समान मानों को कई बार पुनर्गणना करने में थोड़ा अधिक समय निवेश करता है। यह निरर्थक गणना है और यह एक स्पष्ट क्षेत्र है जहां अनुकूलन को लागू किया जा सकता है, या तो संस्मरण के माध्यम से या पुनरावृत्त एल्गोरिदम को नियोजित करके।

अब, हम अनुकूलन करते हैं जहां हमने अपने फाइबोनैचि फ़ंक्शन में संभावित अनुकूलन की पहचान की है। हमने देखा कि फ़ंक्शन एक ही फाइबोनैचि संख्याओं की कई बार पुनर्गणना करता है, जिसके परिणामस्वरूप अनावश्यक अतिरेक और धीमी निष्पादन समय होता है।

इसे अनुकूलित करने के लिए, हम संस्मरण लागू करते हैं। मेमोइज़ेशन एक अनुकूलन तकनीक है जिसमें पहले से गणना किए गए परिणामों (इस मामले में, फाइबोनैचि संख्या) को संग्रहीत करना और उन्हें पुनर्गणना करने के बजाय आवश्यकता होने पर पुन: उपयोग करना शामिल है। यह अनावश्यक गणनाओं को कम करता है और प्रदर्शन में सुधार करता है, विशेष रूप से फाइबोनैचि अनुक्रम जैसे पुनरावर्ती कार्यों के लिए।

हमारे फाइबोनैचि फ़ंक्शन में मेमोइज़ेशन को लागू करने के लिए, हम निम्नलिखित कोड लिखते हैं:

# गणना की गई फाइबोनैचि संख्याओं को संग्रहीत करने के लिए शब्दकोश
fib_cache = { }
डीईएफ़ फाइबोनैचि ( एन ) :
अगर एन <= 1 :
वापस करना एन
# जांचें कि क्या परिणाम पहले से ही कैश्ड है
अगर एन में फ़ाइब_कैश:
वापस करना fib_cache [ एन ]
अन्य :
# परिणाम की गणना करें और कैश करें
fib_cache [ एन ] = फाइबोनैचि ( एन - 1 ) + फाइबोनैचि ( एन - 2 )
वापस करना fib_cache [ एन ] ,

'फाइबोनैचि' फ़ंक्शन के इस संशोधित संस्करण में, हम पहले से गणना की गई फाइबोनैचि संख्याओं को संग्रहीत करने के लिए एक 'फाइबोनैचि' शब्दकोश पेश करते हैं। फाइबोनैचि संख्या की गणना करने से पहले, हम जांचते हैं कि क्या यह पहले से ही कैश में है। यदि ऐसा है, तो हम कैश्ड परिणाम लौटाते हैं। किसी अन्य मामले में, हम इसकी गणना करते हैं, इसे कैश में रखते हैं, और फिर इसे वापस कर देते हैं।

प्रोफ़ाइलिंग और अनुकूलन को दोहराना

अनुकूलन (हमारे मामले में मेमोइज़ेशन) को लागू करने के बाद, हमारे परिवर्तनों के प्रभाव को जानने और यह सुनिश्चित करने के लिए कि हमने कोड के प्रदर्शन में सुधार किया है, प्रोफाइलिंग प्रक्रिया को दोहराना महत्वपूर्ण है।

अनुकूलन के बाद प्रोफाइलिंग

अनुकूलित फाइबोनैचि फ़ंक्शन को प्रोफ़ाइल करने के लिए हम समान प्रोफ़ाइलिंग टूल, 'cProfile' और 'line_profiler' का उपयोग कर सकते हैं। नई प्रोफ़ाइलिंग परिणामों की तुलना पिछले परिणामों से करके, हम अपने अनुकूलन की प्रभावशीलता को माप सकते हैं।

यहां बताया गया है कि हम 'cProfile' का उपयोग करके अनुकूलित 'फाइबोनैचि' फ़ंक्शन को कैसे प्रोफ़ाइल कर सकते हैं:

cprofiler = सीप्रोफ़ाइल. प्रोफ़ाइल ( )

cprofiler. सक्षम ( )

परिणाम = फाइबोनैचि ( 30 )

cprofiler. अक्षम करना ( )

cprofiler. print_stats ( क्रम से लगाना = 'संचयी' )

'लाइन_प्रोफाइलर' का उपयोग करके, हम इसे लाइन दर लाइन प्रोफाइल करते हैं:

%lprun -f फाइबोनैचि फाइबोनैचि ( 30 )

कोड:

# गणना की गई फाइबोनैचि संख्याओं को संग्रहीत करने के लिए शब्दकोश
fib_cache = { }

डीईएफ़ फाइबोनैचि ( एन ) :
अगर एन <= 1 :
वापस करना एन
# जांचें कि क्या परिणाम पहले से ही कैश्ड है
अगर एन में फ़ाइब_कैश:
वापस करना fib_cache [ एन ]
अन्य :
# परिणाम की गणना करें और कैश करें
fib_cache [ एन ] = फाइबोनैचि ( एन - 1 ) + फाइबोनैचि ( एन - 2 )
वापस करना fib_cache [ एन ]
cprofiler = सीप्रोफ़ाइल. प्रोफ़ाइल ( )
cprofiler. सक्षम ( )

परिणाम = फाइबोनैचि ( 30 )

cprofiler. अक्षम करना ( )
cprofiler. print_stats ( क्रम से लगाना = 'संचयी' )
%lprun -f फाइबोनैचि फाइबोनैचि ( 30 )

अनुकूलन के बाद प्रोफाइलिंग परिणामों का विश्लेषण करने के लिए, विशेष रूप से बड़े 'एन' मानों के लिए निष्पादन समय काफी कम हो जाएगा। संस्मरण के कारण, हम देखते हैं कि फ़ंक्शन अब फाइबोनैचि संख्याओं की पुनर्गणना करने में बहुत कम समय खर्च करता है।

अनुकूलन प्रक्रिया में ये चरण आवश्यक हैं। अनुकूलन में प्रोफाइलिंग से प्राप्त टिप्पणियों के आधार पर हमारे कोड में सूचित परिवर्तन करना शामिल है, जबकि प्रोफाइलिंग को दोहराने से यह सुनिश्चित होता है कि हमारे अनुकूलन से अपेक्षित प्रदर्शन में सुधार होता है। पुनरावृत्तीय प्रोफ़ाइलिंग, अनुकूलन और सत्यापन द्वारा, हम बेहतर प्रदर्शन देने और अपने अनुप्रयोगों के उपयोगकर्ता अनुभव को बढ़ाने के लिए अपने पायथन कोड को ठीक कर सकते हैं।

निष्कर्ष

इस लेख में, हमने उस उदाहरण पर चर्चा की जहां हमने Google Colab वातावरण के भीतर प्रोफाइलिंग टूल का उपयोग करके पायथन कोड को अनुकूलित किया। हमने सेटअप के साथ उदाहरण शुरू किया, आवश्यक प्रोफाइलिंग लाइब्रेरी आयात की, नमूना कोड लिखा, इसे 'cProfile' और 'line_profiler' दोनों का उपयोग करके प्रोफाइल किया, परिणामों की गणना की, अनुकूलन लागू किया, और कोड के प्रदर्शन को पुनरावृत्त रूप से परिष्कृत किया।