"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > पायथन प्रोग्रामिंग अनुकूलन तकनीक।

पायथन प्रोग्रामिंग अनुकूलन तकनीक।

2024-08-25 को प्रकाशित
ब्राउज़ करें:712

Python programming optimisation techniques.

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

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

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

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

1. परिवर्तनीय पैकिंग

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

उदाहरण:

import struct

# Packing two integers into a binary format
packed_data = struct.pack('ii', 10, 20)

# Unpacking the packed binary data
a, b = struct.unpack('ii', packed_data)

इस उदाहरण में, स्ट्रक्चर मॉड्यूल का उपयोग करके पूर्णांकों को एक कॉम्पैक्ट बाइनरी प्रारूप में पैक किया जाता है, जिससे डेटा प्रोसेसिंग अधिक कुशल हो जाती है।

2. भंडारण बनाम मेमोरी

स्टोरेज (डिस्क) और मेमोरी (रैम) के बीच अंतर को समझना महत्वपूर्ण है। मेमोरी ऑपरेशन तेज़ लेकिन अस्थिर होते हैं, जबकि स्टोरेज लगातार लेकिन धीमा होता है। प्रदर्शन-महत्वपूर्ण अनुप्रयोगों में, बार-बार एक्सेस किए गए डेटा को मेमोरी में रखना और स्टोरेज I/O को कम करना गति के लिए आवश्यक है।

उदाहरण:

import mmap

# Memory-mapping a file
with open("data.txt", "r b") as f:
    mmapped_file = mmap.mmap(f.fileno(), 0)
    print(mmapped_file.readline())
    mmapped_file.close()

मेमोरी-मैप की गई फ़ाइलें आपको डिस्क स्टोरेज को मेमोरी के रूप में मानने की अनुमति देती हैं, जिससे बड़ी फ़ाइलों के लिए एक्सेस समय तेज हो जाता है।

3. निश्चित-लंबाई बनाम चर-लंबाई चर

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

उदाहरण:

import array

# Using fixed-length array for performance
fixed_array = array.array('i', [1, 2, 3, 4, 5])

# Dynamic list (variable-length)
dynamic_list = [1, 2, 3, 4, 5]

यहां, array.array एक निश्चित-लंबाई वाली सरणी प्रदान करता है, जो गतिशील सूचियों की तुलना में अधिक पूर्वानुमानित प्रदर्शन प्रदान करता है।

4. आंतरिक बनाम सार्वजनिक कार्य

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

उदाहरण:

def _private_function(data):
    # Optimized for internal use, with minimal error handling
    return data ** 2

def public_function(data):
    # Includes additional checks for external use
    if isinstance(data, int):
        return _private_function(data)
    raise ValueError("Input must be an integer")

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

5. फ़ंक्शन संशोधक

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

उदाहरण:

from functools import lru_cache

@lru_cache(maxsize=100)
def compute_heavy_function(x):
    # A computationally expensive operation
    return x ** x

डेकोरेटर के रूप में lru_cache का उपयोग महंगे फ़ंक्शन कॉल के परिणामों को कैश करता है, अनावश्यक गणनाओं से बचकर प्रदर्शन में सुधार करता है।

6. पुस्तकालयों का उपयोग करें

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

उदाहरण:

import numpy as np

# Efficient matrix multiplication using NumPy
matrix_a = np.random.rand(1000, 1000)
matrix_b = np.random.rand(1000, 1000)
result = np.dot(matrix_a, matrix_b)

यहाँ, मैट्रिक्स संचालन के लिए NumPy का डॉट फ़ंक्शन बढ़ाया गया है, जो शुद्ध पायथन में नेस्टेड लूप से कहीं बेहतर प्रदर्शन करता है।

7. शॉर्ट-सर्किटिंग कंडीशनल

शॉर्ट-सर्किटिंग अनावश्यक मूल्यांकन को कम करता है, जो जटिल स्थिति जांच में या संसाधन-गहन संचालन को शामिल करते समय विशेष रूप से मूल्यवान है। यह उन स्थितियों के निष्पादन को रोकता है जिन्हें जाँचने की आवश्यकता नहीं है, जिससे समय और कम्प्यूटेशनल शक्ति दोनों की बचत होती है।
चूंकि सशर्त जांच दूसरे को रोक देगी, उन्हें पहला मान मिलेगा जो शर्त को पूरा करता है, आपको पहले शर्त को मान्य/अमान्य करने की संभावना वाले वेरिएबल्स को रखना चाहिए। OR स्थितियों (या) में, सत्य होने की सबसे अधिक संभावना वाले वेरिएबल को पहले रखने का प्रयास करें, और AND स्थितियों (और) में, गलत होने की सबसे अधिक संभावना वाले वेरिएबल को पहले रखने का प्रयास करें। जैसे ही उस वेरिएबल की जाँच की जाती है, सशर्त अन्य मानों की जाँच किए बिना बाहर निकल सकता है।

उदाहरण:

def complex_condition(x, y):
    return x != 0 and y / x > 2  # Stops evaluation if x is 0

इस उदाहरण में, पायथन के तार्किक ऑपरेटर यह सुनिश्चित करते हैं कि विभाजन केवल तभी निष्पादित किया जाता है जब x गैर-शून्य है, संभावित रनटाइम त्रुटियों और अनावश्यक गणना को रोकता है।

8. मेमोरी खाली करें

लंबे समय तक चलने वाले अनुप्रयोगों में, विशेष रूप से बड़े डेटासेट से निपटने वाले अनुप्रयोगों में, जब इसकी आवश्यकता नहीं रह जाती है तो मेमोरी को खाली करना आवश्यक होता है। यह del, gc.collect() का उपयोग करके, या वस्तुओं को दायरे से बाहर जाने की अनुमति देकर किया जा सकता है।

उदाहरण:

import gc

# Manual garbage collection to free up memory
large_data = [i for i in range(1000000)]
del large_data
gc.collect()  # Forces garbage collection

gc.collect() का उपयोग यह सुनिश्चित करता है कि मेमोरी को तुरंत पुनः प्राप्त किया जाता है, जो मेमोरी-बाधित वातावरण में महत्वपूर्ण है।

9. लघु त्रुटि संदेश

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

उदाहरण:

try:
    result = 10 / 0
except ZeroDivisionError:
    print("Err: Div/0")  # Short, concise error message

लघु त्रुटि संदेश ऐसे वातावरण में उपयोगी होते हैं जहां संसाधन दक्षता महत्वपूर्ण होती है, जैसे IoT डिवाइस या उच्च-आवृत्ति ट्रेडिंग सिस्टम।

10. ऑप्टिमाइज़ लूप्स

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

उदाहरण:

import numpy as np

# Vectorised operation with NumPy
array = np.array([1, 2, 3, 4, 5])

# Instead of looping through elements
result = array * 2  # Efficient, vectorised operation

वेक्टरीकरण स्पष्ट लूप की आवश्यकता को समाप्त करता है, तेजी से निष्पादन के लिए निम्न-स्तरीय अनुकूलन का लाभ उठाता है।


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

पीएस: आप पायथन कोड दक्षता की जांच करने के लिए https://perfpy.com/#/ का उपयोग कर सकते हैं।

विज्ञप्ति वक्तव्य यह लेख यहां पुन: प्रस्तुत किया गया है: https://dev.to/jamesbright/10-python-programming-optimisation-techniques-5ckf?1 यदि कोई उल्लंघन है, तो कृपया इसे हटाने के लिए स्टडी_गोलंग@163.com से संपर्क करें।
नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3