क्या पायथन में एक ढेर / ढेर है और मेमोरी कैसे प्रबंधित की जाती है?


91

पायथन में चर और स्मृति को कैसे प्रबंधित किया जाता है? क्या इसमें एक ढेर और एक ढेर है और स्मृति को प्रबंधित करने के लिए किस एल्गोरिथ्म का उपयोग किया जाता है? यह देखते हुए कि क्या बड़ी संख्या / डेटा क्रंचिंग के लिए मेमोरी प्रबंधन पर कोई सिफारिशें हैं?


1
आप निम्नलिखित दो में से एक को पढ़ने के लिए चाहते हो सकता है: foobarnbaz.com/2012/07/08/understanding-python-variables docs.python.org/2/c-api/memory.html
user1690293

1
क्या पायथन संस्करण / स्मृति प्रबंधन के साथ कुछ विशिष्ट समस्या है जिसे आप के साथ समस्या हो रही है और तुच्छ प्रलेखन और / या Googling द्वारा खोजा नहीं गया है?
मार्टिन जेम्स

जवाबों:


111

अजगर में कैसे चर और स्मृति का प्रबंधन किया जाता है।

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

क्या इसमें एक ढेर और एक ढेर है और स्मृति को प्रबंधित करने के लिए किस एल्गोरिथ्म का उपयोग किया जाता है?

जब हम इसके बारे में बात कर रहे हैं तो CPythonयह वस्तुओं के भंडारण के लिए एक निजी ढेर का उपयोग करता है । CPython C API प्रलेखन से :

पायथन में मेमोरी प्रबंधन में एक निजी ढेर शामिल होता है जिसमें सभी पायथन ऑब्जेक्ट और डेटा संरचनाएं होती हैं। इस निजी ढेर का प्रबंधन आंतरिक रूप से पायथन मेमोरी मैनेजर द्वारा सुनिश्चित किया गया है। पायथन मेमोरी मैनेजर में विभिन्न घटक होते हैं जो विभिन्न गतिशील भंडारण प्रबंधन पहलुओं से निपटते हैं, जैसे साझाकरण, विभाजन, प्रचार या कैशिंग।

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

नोट: कृपया ध्यान रखें कि यह जानकारीCPythonविशिष्ट है। जैसे अन्य अजगर कार्यान्वयन,pypy,iron python,jythonऔर दूसरों को एक दूसरे से और CPython से अलग हो सकता है जब यह उनके कार्यान्वयन बारीकियों की बात आती है। इसे बेहतर समझने के लिए, यह समझने में मदद मिल सकती है कि पायथन शब्दार्थ (भाषा) और अंतर्निहित कार्यान्वयन के बीच अंतर है

यह देखते हुए कि क्या बड़ी संख्या / डेटा क्रंचिंग के लिए मेमोरी प्रबंधन पर कोई सिफारिशें हैं?

अब मैं इस बारे में नहीं बोल सकता, लेकिन मुझे यकीन है कि NumPy (नंबर क्रंचिंग के लिए सबसे लोकप्रिय पायथन लाइब्रेरी) में ऐसे तंत्र हैं जो स्मृति खपत को इनायत से संभालते हैं।

यदि आप अजगर के आंतरिक के बारे में अधिक जानना चाहते हैं, तो इन संसाधनों पर एक नज़र डालें:


5
आप का अच्छा आप अजगर बनाम CPython का गौरव तनाव;)
phant0m

1
ध्यान दें कि स्थानीय चर में स्टैक फ्रेम के बराबर में संग्रहीत वास्तविक चर होंगे।
मार्सिन

1
अजगर जावा नहीं है; इसमें वर्चुअल मशीन नहीं है; इसमें एक दुभाषिया है। यह इंगित करने के लिए पांडित्य लग सकता है, लेकिन वे दो अलग-अलग प्रतिमान हैं और इस अंतर के लिए महत्वपूर्ण निहितार्थ हैं कि कोड कैसे संकलित किए जाते हैं और चलते हैं। stackoverflow.com/questions/441824/…
अपोलो 2020

48

अजगर के पास ऐसी कोई चीज नहीं है ।

पायथन भाषा है और यह निर्दिष्ट नहीं करती है कि पायथन द्वारा परिभाषित शब्दार्थ को वास्तव में कैसे लागू किया जाना चाहिए।

हर कार्यान्वयन (CPython, PyPy, IronPython, stackless , Jython ...) अपनी ही बात करने के लिए स्वतंत्र है!

में सी अजगर, सभी वस्तुओं ढेर पर रहते हैं:

पायथन में मेमोरी प्रबंधन में एक निजी ढेर शामिल होता है जिसमें सभी पायथन ऑब्जेक्ट और डेटा संरचनाएं होती हैं। 1

CPython वर्चुअल मशीन स्टैक आधारित है:

>>> def g():
    x = 1
    y = 2
    return f(x, y)

>>> import dis
>>> dis.dis(g)
  2           0 LOAD_CONST           1 (1) # Push 1 onto the stack
              3 STORE_FAST           0 (x) # Stores top of stack into local var x

  3           6 LOAD_CONST           2 (2) # Push 2 onto stack
              9 STORE_FAST           1 (y) # Store TOS into local var y

  4          12 LOAD_GLOBAL          0 (f) # Push f onto stack
             15 LOAD_FAST            0 (x) # Push x onto stack
             18 LOAD_FAST            1 (y) # Push y onto stack
             21 CALL_FUNCTION        2     # Execute function with 2 
                                           # f's return value is pushed on stack
             24 RETURN_VALUE               # Return TOS to caller (result of f)

ध्यान रखें, कि यह सीपीथॉन विशिष्ट है। ढेर में वास्तविक मूल्य शामिल नहीं हैं , हालांकि, यह उन वस्तुओं का संदर्भ रखता है।

1 : स्रोत

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.