संपादित 2 सप्ताह पहले द्वारा ExtremeHow संपादकीय टीम
मैटलैबकोड अनुकूलनप्रदर्शन ट्यूनिंगगति सुधारमेमोरी प्रबंधनदक्षताबेंचमार्किंगमैटलैब फंक्शंसस्क्रिप्टएल्गोरिदमकम्प्यूटेशनल तकनीक
अनुवाद अपडेट किया गया 2 सप्ताह पहले
जब मैट्लैब, जो कि लाखों इंजीनियरों और वैज्ञानिकों द्वारा उपयोग की जाने वाली एक कंप्यूटिंग प्लेटफॉर्म है, के साथ काम करते हैं, तब कभी-कभी यह सुनिश्चित करना महत्वपूर्ण हो जाता है कि आप जो कोड लिख रहे हैं वह जितना संभव हो सके उतना कुशलता से चले। MATLAB में कोड ऑप्टिमाइज़ेशन का तात्पर्य कोड के निष्पादन समय, मेमोरी के उपयोग या दोनों को सुधारने से है। आइए मैट्लैब कोड को बेहतर प्रदर्शन के लिए कैसे अनुकूलित करें, इस पर गहराई से नज़र डालें।
मैटलैब में सबसे प्रभावी ऑप्टिमाइज़ेशन तकनीकों में से एक वेक्टराइजेशन है। MATLAB मैट्रिक्स और वेक्टर ऑपरेशनों के लिए अत्यधिक अनुकूलित है, और इसलिए वेक्टराइज्ड कोड अक्सर लूप्स की तुलना में काफी तेज़ होता है। डेटा सेट पर संचालित करने के लिए फॉर-लूप्स का उपयोग करने के बजाय, वेक्टराइज्ड ऑपरेशनों का उपयोग करें।
उदाहरण के लिए, मान लीजिए कि आपके पास दो बराबर आकार के x
और y
नामक सरणियाँ हैं, और आप इन सरणियों के तत्व-प्रति-तत्व योग को प्राप्त करना चाहते हैं:
% गैर-वेक्टराइज्ड कोड for i = 1: length(x) z(i) = x(i) + y(i); end % वेक्टराइज्ड कोड z = x + y;
वेक्टराइज्ड संस्करण बहुत तेज़ है क्योंकि MATLAB गणनाओं को करने के लिए अनुकूलित, निम्न-स्तरीय पुस्तकालयों का लाभ उठाता है।
MATLAB सरणियाँ गतिशील होती हैं, लेकिन गतिशील आकार बदलना धीमा हो सकता है क्योंकि इसके लिए नई मेमोरी आवंटन की आवश्यकता होती है। आप लूप के अंदर जाने से पहले अपनी सरणी के आकार को पूर्व-आवंटित करके प्रदर्शन को अनुकूलित कर सकते हैं। इससे MATLAB को हर बार डेटा जोड़ने के समय सरणी को गतिशील रूप से आकार देने से रोकता है।
इस उदाहरण पर विचार करें:
% पूर्व-आवंटन के बिना for i = 1:1000 a(i) = i^2; end % पूर्व-आवंटन के साथ a = zeros(1, 1000); for i = 1:1000 a(i) = i^2; end
सरणी A
को पूर्व-आवंटित करना महत्वपूर्ण प्रदर्शन सुधार की ओर ले जाता है।
MATLAB में कई निर्मित फ़ंक्शन सम्मिलित होते हैं जो प्रदर्शन के लिए पहले से ही अनुकूलित होते हैं। जब भी संभव हो, अपने संस्करण के कार्यान्वयन को लिखने के बजाय इन निर्मित फ़ंक्शनों का उपयोग करें।
उदाहरण के लिए, किसी सरणी के तत्वों का योग प्राप्त करने के लिए, लूप लिखने के बजाय MATLAB के sum()
फ़ंक्शन का उपयोग करें:
% अप्रशिक्षित total = 0; for i = 1: length(A) total = total + A(i); end % प्रशिक्षित total = sum(a);
निर्मित sum(A)
फ़ंक्शन न केवल सरल है बल्कि तेज़ भी है।
MATLAB की मेमोरी प्रबंधन में सरणियों से पहले मेमोरी का आवंटन होता है। अनावश्यक मेमोरी आवंटन से बचने के लिए जहां भी संभव हो, वेरिएबल्स का पुनः उपयोग करें और सुनिश्चित करें कि आपकी सरणी आकार की शुरुआत से मेल खाती है।
उदाहरण के लिए, जब डेटा को अक्सर एक सरणी में जोड़ा जाता है, तो पहले से आवश्यक मेमोरी ब्लॉकों की गणना करना बेहतर होता है।
MATLAB एक प्रोफाइलिंग उपकरण प्रदान करता है जो आपके कोड में प्रदर्शन संबंधी बॉटलनेक की पहचान करने में आपकी सहायता करता है। profile
कमांड का उपयोग करके अपनी स्क्रिप्ट चलाएँ और एक रिपोर्ट उत्पन्न करें जो दिखाए कि आपके कोड के कौन से भाग सबसे अधिक समय ले रहे हैं।
profile on yourfunction() profile viewer
प्रोफाइलर रिपोर्ट की समीक्षा से आपको यह जानकारी मिल सकती है कि किस अनुभाग को अनुकूलित करने की आवश्यकता है।
मेमोरी उपयोग कोड प्रदर्शन में एक महत्वपूर्ण कारक है। int8
, int16
आदि जैसे कम मेमोरी खपत करने वाले उचित डेटा प्रकारों का उपयोग करने पर विचार करें, उन वेरिएबल्स के लिए जिन्हें विशेष रूप से double
प्रकार होने की आवश्यकता नहीं है।
% छोटे डेटा प्रकार में कनवर्ट करना a = int8(a);
तार्किक अनुक्रमण डेटा के उपसमुच्चयों के साथ बिना लूप के काम करने का एक संक्षिप्त तरीका है। यह आपके कोड को काफी तेज़ बना सकता है।
% बिना तार्किक अनुक्रमण के index = []; for i = 1: length(A) if A(i) > 0 index = [index, i]; end end positive_elements = A(index); % तार्किक अनुक्रमण के साथ positive_elements = A(A > 0);
MATLAB में तार्किक अनुक्रमण अधिक तेज़ और कुशल है।
parfor
का उपयोग करेंकभी-कभी, गणनाओं को समानांतर में किया जा सकता है ताकि निष्पादन की गति बढ़ सके। parfor
लूप आपको समानांतर में पुनरावृत्तियाँ चलाने की अनुमति देता है, बशर्ते आपके पास एक समानांतर कंप्यूटिंग टूलबॉक्स हो।
% सामान्य फॉर-लूप for i = 1:N c(i) = a(i) + b(i); end % समानांतर फॉर-लूप parfor i = 1:N c(i) = a(i) + b(i); end
parfor
का उपयोग कई CPU कोर का लाभ उठाता है, जिससे गति में सुधार होता है।
वैश्विक वेरिएबल्स कोड को धीमा कर सकते हैं क्योंकि वे सभी वेरिएबल्स को वैश्विक बनाने के लिए अपना स्कोप बदलते हैं। यह अनुशंसा की जाती है कि वेरिएबल्स को फ़ंक्शन तर्क के रूप में पास किया जाए या उन्हें संरचना या वर्ग ऑब्जेक्ट के फ़ील्ड के रूप में संग्रहीत किया जाए।
मैटलैब में कोड प्रदर्शन को अनुकूलित करना अधिक कुशल और तेज़ स्क्रिप्ट या फ़ंक्शंस को जन्म दे सकता है। वेक्टराइजेशन, पूर्व-आवंटित सरणियों का उपयोग, निर्मित फ़ंक्शनों का उपयोग, और समानांतर कंप्यूटिंग जैसी प्रथाओं को शामिल करना महत्वपूर्ण प्रदर्शन वृद्धि प्रदान कर सकता है। यह भी महत्वपूर्ण है कि MATLAB के प्रोफाइलर और अन्य उपकरणों का उपयोग करके अपने कोड की बॉटलनेक को समझें। इन तरीकों को लागू करने से प्रबंधनीय कोड निष्पादन समय और मेमोरी उपयोग बनाए रखने में मदद मिलती है, जो कि मैट्लैब में बड़े पैमाने पर और उच्च प्रदर्शन वाली कंप्यूटिंग कार्यों दोनों के लिए आवश्यक है।
याद रखें, अनुकूलन करते समय पठनीयता और प्रदर्शन के बीच संतुलन बनाए रखना महत्वपूर्ण होता है। बहुत अधिक अनुकूलन कोड को समझने में कठिन बना सकता है। हमेशा अनुकूलन क्लस्टर करें और कोड की रखरखाव के लिए स्पष्ट दस्तावेज़ीकरण बनाए रखें।
यदि आपको लेख की सामग्री में कुछ गलत लगता है, आप कर सकते हैं