2011-09-25 19 views
5

क्यों"sys.getrefcount()" वापसी मान

sys.getrefcount() 

वापसी 3 हर बड़ी संख्या में या साधारण स्ट्रिंग के लिए? क्या इसका मतलब है कि 3 वस्तुओं कार्यक्रम में कहीं रहते हैं? इसके अलावा, क्यों की स्थापना नहीं करता है x = (बहुत बड़ी संख्या) उस ऑब्जेक्ट की रेफ गिनती को बढ़ाती है? क्या उन 3 रेफ मायने रखती हैं जो मेरे कॉल से ग्रिफकाउंट प्राप्त करती हैं? इसे स्पष्ट करने के लिए धन्यवाद।

उदाहरण के लिए

:

>>> sys.getrefcount(4234234555) 
3 
>>> sys.getrefcount("testing") 
3 
>>> sys.getrefcount(11111111111111111) 
3 
>>> x=11111111111111111 
>>> sys.getrefcount(11111111111111111) 
3 
+0

हालांकि x = "परीक्षण" रेफ गिनती बढ़ाता है, x = (बड़ी संख्या) नहीं है। – kaiseroskilo

उत्तर

9

बड़े पूर्णांक वस्तुओं interpretor द्वारा पुन: उपयोग नहीं कर रहे हैं, तो आप दो अलग-अलग वस्तुओं मिलता है:

>>> a = 11111 
>>> b = 11111 
>>> id(a) 
40351656 
>>> id(b) 
40351704 

sys.getrefcount (11111) हमेशा एक ही नंबर प्रदान करता है, क्योंकि यह एक ताजा की संदर्भ गिनती उपायों वस्तु थी।

छोटे पूर्णांक के लिए, अजगर हमेशा एक ही वस्तु पुनः उपयोग कर लेता:

>>> sys.getrefcount(1) 
73 

आमतौर पर आप एक नई वस्तु को केवल एक संदर्भ मिलेगा:

>>> sys.getrefcount(object()) 
1 

लेकिन पूर्णांकों एक विशेष पूर्व में आवंटित किए जाते हैं प्रदर्शन अनुकूलन के लिए पायथन द्वारा मॉलोकैड क्षेत्र, और मुझे संदेह है कि अतिरिक्त दो संदर्भों के साथ कुछ करने के लिए कुछ है।

आप सी कार्यान्वयन यहाँ देख सकते हैं: http://svn.python.org/view/python/trunk/Objects/intobject.c?view=markup

संपादित करें: मैं समझता हूँ कि क्या lowlevel विवरण में हो रहा है का दावा नहीं करते, मुझे लगता है कि काम पर कई चीजें हैं जो अस्थायी संदर्भ कैश कर रहे हैं:

print sys.getrefcount('foo1111111111111' + 'bar1111111111111') #1 
print sys.getrefcount(111111111111 + 2222222222222)   #2 
print sys.getrefcount('foobar333333333333333333')    #3 
6
  1. छोटे तार और पूर्णांकों वस्तु निर्माण लागत पर बचाने के लिए अजगर द्वारा कैश कर रहे हैं।

  2. इंटरैक्टिव पायथन दुभाषिया आपके द्वारा दर्ज प्रत्येक शाब्दिक के लिए एक अस्थायी संदर्भ रखता है। getrefcount('foo' + 'bar') के साथ getrefcount('foobar') की तुलना करें। ,

गिनती लौटे आम ​​तौर पर एक से अधिक आप उम्मीद कर सकते है, क्योंकि यह शामिल हैं: (उत्तरार्द्ध मामले में, दुभाषिया 'foo' और 'bar' के लिए संदर्भ है।)

  • manual से (अस्थायी) संदर्भ getrefcount() पर एक तर्क के रूप में संदर्भ।

  • +0

    तो यह अस्थायी रेफरी के लिए कैश + 1 के लिए 1 है। तीसरे के बारे में क्या? क्या यह पाइथन के आंतरिक से संबंधित है? – kaiseroskilo

    +2

    @kaiseroskilo: नहीं, यह अस्थायी संदर्भों के लिए +2 है; इंटरैक्टिव अपरिवर्तनीय में से एक, और 'getrefcount' में से एक क्योंकि स्वयं ऑब्जेक्ट को तर्क के रूप में पारित किया जाता है। –

    +0

    ठीक है अब मुझे मिल गया! धन्यवाद! – kaiseroskilo

    संबंधित मुद्दे