2010-01-20 12 views
78

क्या कोई जानता है कि पाइथन आंतरिक रूप से int और लंबे प्रकार का प्रबंधन कैसे करता है?पाइथन int और लंबे समय तक कैसे प्रबंधित करता है?

  • क्या यह सही प्रकार का गतिशील रूप से चुनता है?
  • इंट की सीमा क्या है?
  • मैं पाइथन 2.6 का उपयोग कर रहा हूं, क्या पिछले संस्करणों के साथ अलग है?

मुझे नीचे दिए गए कोड को कैसे समझना चाहिए?

>>> print type(65535) 
<type 'int'> 
>>> print type(65536*65536) 
<type 'long'> 

अद्यतन:

>>> print type(0x7fffffff) 
<type 'int'> 
>>> print type(0x80000000) 
<type 'long'> 
+0

क्या वे सिर्फ सीपीडॉन में फ्लाई अंडरटेट पर stdc प्रकारों पर मानचित्र नहीं हैं? –

+0

हाँ, मुझे लगता है कि वे करते हैं। मुझे यह भी संदेह है कि ढेर पर सबकुछ आवंटित किया जाता है, इसलिए जब किसी संख्या को अधिक सटीकता की आवश्यकता होती है तो वे इसे ठीक से 'realloc' करते हैं। लेकिन मुझे पूरा यकीन नहीं है, इसलिए मैं किसी और को जवाब छोड़ दूंगा। – zneak

+1

आप 'var = 666L' – qba

उत्तर

79

int और long "एकीकृत" a few versions back थे। इससे पहले गणित के माध्यम से एक int को बहाना संभव था।

3.x ने पूरी तरह से int को अलग करके और केवल लंबे समय तक इसे बढ़ाकर आगे बढ़ाया है।

पायथन 2: sys.maxint में पाइथन int अधिकतम पकड़ हो सकता है।

पायथन 3: sys.maxsize में पाइथन int अधिकतम पकड़ हो सकता है।

+16

लेकिन पायथन 3 इस प्रकार 'int' को कॉल करता है, भले ही यह 2.x के 'लंबे' जैसा व्यवहार करता है। –

+3

टिप्पणी टेड द्वारा: नीचे उल्लेख किया है सावधान रहना कुछ कास्टिंग int करने के लिए है कि कि maxint से बड़ा है अभी भी एक लंबे >>> प्रकार का परिणाम देगा (पूर्णांक (sys.maxint + 1)) StuartLC

+2

sys.maxint आप दे देंगे सबसे बड़ा 64 बिट पूर्णांक (मेरी 64 बिट मशीन पर) एक लम्बाई 64 बिट्स जितना बड़ा हो सकता है, बस "sys.maxint << 1000000" – fccoelho

11

यह PEP मदद करनी चाहिए।

निष्कर्ष है कि तुम सच अजगर संस्करणों में इसके बारे में चिंता करने की ज़रूरत नहीं होना चाहिए> 2.4

+8

आपको इसके बारे में चिंता करने की ज़रूरत है यदि आपको सी में एक इंट फ़ंक्शन को कॉल करना है जो int में फिट नहीं होगा (यानी एक लंबा)। लंबे समय तक कास्टिंग की कोई मात्रा-> int मदद करेगा। हाल ही में मेरे साथ हुआ। – Macke

+1

@ मैके: इस टिप्पणी ने मुझे बचाया, मुझे लगता है कि int चाल करेगा, और सोच रहा था कि मुझे अभी भी ज्योथन अपवाद क्यों मिल रहा था। – ted

+0

@ मैके बिल्कुल सच है। कंपनी में मैं वर्तमान में काम करता हूं हमारे पास पाइथन में लिखा गया सिम्युलेटर है जो टिंकर प्रविष्टियों के माध्यम से उपयोगकर्ता इनपुट लेता है और एक एम्बेडेड सिस्टम की नकल करने वाले क्लाइंट (सी/सी ++ में लिखे गए) को टीसीपी/आईपी के माध्यम से जाली मान भेजता है। कल्पना करें कि जब आप अपने पायथन-आधारित प्रविष्टि में 100000000000000000000000 डालते हैं तो क्या होता है ...: पी – rbaleksandar

3

मेरी मशीन पर:

>>> print type(1<<30) 
<type 'int'> 
>>> print type(1<<31) 
<type 'long'> 
>>> print type(0x7FFFFFFF) 
<type 'int'> 
>>> print type(0x7FFFFFFF+1) 
<type 'long'> 

अजगर ints का उपयोग करता है (32 बिट पर हस्ताक्षर किए पूर्णांक, मैं ' टी पता नहीं है कि वे हुड के नीचे सी इंट हैं या नहीं) 32 बिट में फिट होने वाले मानों के लिए, लेकिन स्वचालित रूप से लंबे समय तक स्विच करता है (मनमाने ढंग से बड़ी संख्या में बिट्स - यानी बिग्नम्स) कुछ भी बड़ा होता है। मैं इस गति को छोटे मूल्यों के लिए अनुमान लगा रहा हूं जबकि बिग्नम्स में एक सहज संक्रमण के साथ किसी भी अतिप्रवाह से परहेज करता हूं।

0

यह उन्हें प्रबंधित करता है क्योंकि int और long भाई कक्षा परिभाषाएं हैं। उनके पास +, -, *, /, आदि के लिए उचित तरीके हैं, जो उपयुक्त वर्ग के परिणाम उत्पन्न करेंगे।

उदाहरण

>>> a=1<<30 
>>> type(a) 
<type 'int'> 
>>> b=a*2 
>>> type(b) 
<type 'long'> 

इस मामले में के लिए, वर्ग int एक __mul__ विधि (एक है कि * लागू करता है) जो एक long परिणाम पैदा करता है जब आवश्यक है।

3

दिलचस्प। मेरी 64-बिट (i7 उबंटू) बॉक्स में:

>>> print type(0x7FFFFFFF) 
<type 'int'> 
>>> print type(0x7FFFFFFF+1) 
<type 'int'> 

यह एक बड़ी मशीन के 64 बिट ints अप करने के लिए कदम लगता।

+2

पायथन मशीन के लिए उपलब्ध बड़े पूर्णांक प्रकार का उपयोग करता है। SO आमतौर पर 32-बिट मशीनों पर 32 बिट आकार होगा, जबकि 64 बिट-मशीनों पर 64 बिट आकार होगा। लेकिन 64 बिट पूर्णांक को परिभाषित करने वाले 32-बिट आर्किटेक्चर हो सकते हैं, उस स्थिति में पाइथन 64-बिट पूर्णांक का उपयोग करेगा। – Bakuriu

0

पायथन 3.x से, एकीकृत पूर्णांक libries पुराने संस्करणों की तुलना में और भी अधिक स्मार्ट हैं।मेरी (i7 उबंटू) बॉक्स पर मैं निम्नलिखित मिल गया,

>>> type(math.factorial(30)) 
<class 'int'> 

कार्यान्वयन जानकारी के लिए Include/longintrepr.h, Objects/longobject.c and Modules/mathmodule.c फ़ाइलें देखें। अंतिम फ़ाइल एक गतिशील मॉड्यूल है (एक फ़ाइल के लिए संकलित)। कोड का पालन करने के लिए अच्छी तरह से टिप्पणी की है।

2

पायथन 2.7.9 स्वत: प्रचार संख्या। ऐसे मामले के लिए जहां कोई int() या long() का उपयोग करने के लिए अनिश्चित है।

>>> a = int("123") 
>>> type(a) 
<type 'int'> 
>>> a = int("111111111111111111111111111111111111111111111111111") 
>>> type(a) 
<type 'long'> 
संबंधित मुद्दे