यह पाया गया है कि यदि पायथन कोड सामान्य रूप से चलाया जाता है और फिर यदि इसे पायथन फंक्शन में चलाया जाता है, तो यह बाद के मामले में तेज़ी से चलता है। मैं जानना चाहता हूं कि पायथन कोड फंक्शन में तेज़ी से क्यों चलता है।
आम तौर पर पाया जाता है कि पायथन फंक्शन में लोकल वेरिएबल्स को स्टोर करना ग्लोबल वेरिएबल्स की तुलना में तेज़ होता है। इसे निम्नानुसार समझाया जा सकता है।
लोकल/ग्लोबल वेरिएबल स्टोर टाइम्स के अलावा, ओपकोड प्रेडिक्शन फंक्शन को तेज़ बनाता है।
CPython मूल पायथन कार्यान्वयन है जिसे हम Python.org से डाउनलोड करते हैं। इसे बाद के पायथन कार्यान्वयन से अलग करने के लिए और भाषा इंजन के कार्यान्वयन को पायथन प्रोग्रामिंग भाषा से अलग करने के लिए CPython कहा जाता है।
CPython C भाषा में कार्यान्वित होता है। CPython हमारे पायथन कोड को बाइटकोड में संकलित करता है और उस बाइटकोड को एक मूल्यांकन लूप में इंटरप्रेट करता है।
जब एक फंक्शन संकलित होता है, तो लोकल वेरिएबल्स एक फिक्स्ड-साइज़ ऐरे में संग्रहीत होते हैं (डिक्शनरी नहीं) और वेरिएबल नामों को इंडेक्स असाइन किए जाते हैं। यह संभव है क्योंकि आप डायनामिक रूप से फंक्शन में लोकल वेरिएबल्स नहीं जोड़ सकते। फिर लोकल वेरिएबल को पुनः प्राप्त करना सचमुच सूची में पॉइंटर लुकअप और PyObject पर रेफकाउंट बढ़ाना है जो नगण्य है।
इसकी तुलना ग्लोबल लुकअप से करें, जो हैश आदि को शामिल करते हुए एक वास्तविक डिक्शनरी खोज है। संयोग से, यही कारण है कि यदि आप चाहते हैं कि कोई वेरिएबल ग्लोबल हो तो आपको global निर्दिष्ट करना होगा: यदि आप कभी किसी स्कोप के अंदर किसी वेरिएबल को असाइन करते हैं, तो कंपाइलर उसकी एक्सेस के लिए STORE_FAST जारी करेगा जब तक कि आप उसे न बताएं।
वैसे, ग्लोबल लुकअप अभी भी काफी अनुकूलित हैं। एट्रिब्यूट लुकअप वास्तव में धीमे हैं!