python - क्या पायथन एक वैरिएबल का अनुकूलन करता है जो केवल एक वापसी मूल्य के रूप में उपयोग किया जाता है?




interpreter python-internals (2)

दोनों मूल रूप से एक ही हैं सिवाय इसके कि पहले मामले में ऑब्जेक्ट 42 बस a या नाम के a चर के लिए तैयार किया जाता है, दूसरे शब्दों में, नाम (यानी) मूल्यों का संदर्भ (यानी 42 )। यह तकनीकी रूप से कोई भी असाइनमेंट नहीं करता है, इस अर्थ में कि यह कभी भी किसी डेटा को कॉपी नहीं करता है।

इंग return के रूप में, इस बाइंडिंग a नाम को पहले मामले में लौटाया जाता है जबकि ऑब्जेक्ट 42 को दूसरे मामले में वापस किया जाता है।

अधिक पढ़ने के लिए, नेड बैचेल्ड द्वारा इस महान लेख को देखें

निम्नलिखित दो कोड स्निपेट के बीच कोई अंतिम अंतर है? पहले किसी फ़ंक्शन में एक वैरिएबल के लिए एक मान प्रदान करता है और फिर उस वैरिएबल को लौटाता है। दूसरा फ़ंक्शन सीधे मान लौटाता है।

क्या पायथन उन्हें बराबर बाइटकोड में बदल देता है? क्या उनमें से एक तेज है?

केस 1 :

def func():
    a = 42
    return a

केस 2 :

def func():
    return 42

नहीं, यह नहीं है

CPython बाइट कोड का संकलन केवल एक छोटे से पीपीओहोल ऑप्टिमाइज़र के माध्यम से पारित किया गया है जो केवल मूल अनुकूलन करने के लिए डिज़ाइन किया गया है (इन अनुकूलन पर अधिक के लिए परीक्षण सूट में test_peepholer.py देखें)।

वास्तव में क्या होने जा रहा है, इस पर एक नज़र डालने के लिए, जनरेट किए गए निर्देशों को देखने के लिए dis * का उपयोग करें। पहले फ़ंक्शन के लिए, असाइनमेंट युक्त:

from dis import dis
dis(func)
  2           0 LOAD_CONST               1 (42)
              2 STORE_FAST               0 (a)

  3           4 LOAD_FAST                0 (a)
              6 RETURN_VALUE

जबकि, दूसरे समारोह के लिए:

dis(func2)
  2           0 LOAD_CONST               1 (42)
              2 RETURN_VALUE

पहले दो और (तेज़) निर्देशों का उपयोग किया जाता है: STORE_FAST और LOAD_FAST । ये एक त्वरित स्टोर बनाते हैं और वर्तमान निष्पादन फ्रेम के fastlocals सरणी में मूल्य को fastlocals । फिर, दोनों स्थितियों में, एक RETURN_VALUE प्रदर्शन किया जाता है। इसलिए, दूसरे को निष्पादित करने के लिए आवश्यक कम आदेशों के कारण कभी-कभी थोड़ा तेज होता है।

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

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

* dis एक छोटा सा पायथन मॉड्यूल है जो आपके कोड को असेंबल करता है, आप इसका उपयोग Python bytecode को देखने के लिए कर सकते हैं जिसे VM निष्पादित करेगा।

नोट: जैसा कि @Jorn Vernee द्वारा एक टिप्पणी में कहा गया है, यह पायथन के CPython कार्यान्वयन के लिए विशिष्ट है। अन्य कार्यान्वयन अधिक आक्रामक अनुकूलन कर सकते हैं यदि वे चाहते हैं, तो सीपीथॉन नहीं करता है।






python-internals