2009-09-06 14 views
9

मैं एक प्रोग्रामिंग समस्या है जहाँ मैं 100000 अंक से जुड़े एक संख्या को संभालने की ज़रूरत पर काम कर रहा हूँ में बड़ी संख्या हैंडलिंग। इस तरह पाइथन संभाल संख्या कर सकते हैं?कोड

+1

बहुत समान: http://stackoverflow.com/questions/538551/handling-very-large-numbers-in-python –

+1

इन नंबरों के साथ आप जो कर रहे हैं उसके आधार पर, आप उन्हें लॉग (संख्या) के रूप में संग्रहीत करने पर विचार कर सकते हैं)। – mpen

उत्तर

3

ज़रूर यह कर सकते हैं:

>>> s = 10 ** 100000 
3

यह ठीक से काम करने लगता है:

>>> x = 10**100000 
>>> x 
10000000000000000000000000000000000000000000000000000000000000000000000000000000 
[snip] 
00000000L 

http://docs.python.org/library/stdtypes.html के अनुसार,, जो संभवत: इसका मतलब है कि उनके आकार सीमित नहीं है "लंबे समय से पूर्णांकों असीमित सटीक नहीं है।"

7

हाँ; पायथन 2.x में दो प्रकार के पूर्णांक हैं, int सीमित आकार और लंबेअसीमित आकार। हालांकि यदि आवश्यक हो तो सभी गणना स्वचालित रूप से लंबे समय तक परिवर्तित हो जाएंगी। बड़ी संख्याओं को संभालना ठीक काम करता है, लेकिन धीमी चीजों में से एक होगा यदि आप आउटपुट में 100000 अंक मुद्रित करने का प्रयास करते हैं, या यहां से एक स्ट्रिंग बनाने का प्रयास भी करते हैं।

तुम भी मनमाना दशमलव तय सूत्री सटीक की जरूरत है, वहाँ दशमलव मॉड्यूल है।

23

अन्य उत्तर संकेत दिया के रूप में, पायथन समर्थन पूर्णांक संख्या उपलब्ध स्मृति की मात्रा से केवल घिरा है। आप उनके लिए भी तेजी से समर्थन चाहते हैं, कोशिश gmpy (gmpy के लेखक और वर्तमान सह मेंटेनर के रूप में मैं निश्चित रूप से एक छोटे से पक्षपाती यहाँ हूँ ;-):

$ python -mtimeit -s'import gmpy; x=10**100000; y=gmpy.mpz(x)' 'x+1' 
10000 loops, best of 3: 114 usec per loop 
$ python -mtimeit -s'import gmpy; x=10**100000; y=gmpy.mpz(x)' 'y+1' 
10000 loops, best of 3: 65.4 usec per loop 

आमतौर पर, गणित के साथ काम करने के लिए टोंटी नहीं है इस तरह की संख्या (हालांकि gmpy के कुछ मिश्रित और संख्या-सैद्धांतिक कार्यों के लिए प्रत्यक्ष समर्थन मदद कर सकते हैं, तो क्या आप इस तरह की संख्या के साथ कर रहे हैं)। दशमलव स्ट्रिंग में संख्या टर्निंग शायद आम आपरेशन कि धीमी महसूस होगा है ...:

$ python -mtimeit -s'import gmpy; x=10**100000; y=gmpy.mpz(x)' 'str(x)' 
10 loops, best of 3: 3.11 sec per loop 
$ python -mtimeit -s'import gmpy; x=10**100000; y=gmpy.mpz(x)' 'str(y)' 
10 loops, best of 3: 27.3 msec per loop 

जैसा कि आप देख, बड़ी संख्या के में भी gmpy stringification धीमी बार एक सरल इसके अलावा से के सैकड़ों हो सकता है (अफसोस, यह एक आंतरिक जटिल ऑपरेशन है!); लेकिन देशी पायथन कोड में समय के अनुपात हजारों एक साधारण जोड़ से धीमे धीमे हो सकते हैं, इसलिए आप वास्तव में इसके लिए देखना चाहते हैं, खासकर यदि आप डाउनलोड नहीं करते हैं और gmpy इंस्टॉल नहीं करते हैं (उदाहरण के लिए आप नहीं कर सकते: उदाहरण के लिए, gmpy वर्तमान में Google App Engine पर समर्थित नहीं है)।

अंत में

, एक मध्यवर्ती मामला:

$ python2.6 -mtimeit -s'import gmpy; x=10**100000; y=gmpy.mpz(x)' 'x*x' 
10 loops, best of 3: 90 msec per loop 
$ python2.6 -mtimeit -s'import gmpy; x=10**100000; y=gmpy.mpz(x)' 'y*y' 
100 loops, best of 3: 5.63 msec per loop 
$ python2.6 -mtimeit -s'import gmpy; x=10**100000; y=gmpy.mpz(x)' 'y*x' 
100 loops, best of 3: 8.4 msec per loop 

जैसा कि आप देख, देशी अजगर कोड में दो बड़ी संख्या गुणा, सरल इसके अलावा की तुलना में लगभग 1000 बार धीमी हो सकती है, जबकि gmpy साथ मंदी कम से कम 100 गुना है (और यह बहुत बुरा भी एक ही अगर है, तो संख्या gmpy के स्वयं के प्रारूप में पहले से ही है तो यह है कि वहाँ अन्य परिवर्तित करने की भूमि के ऊपर है नहीं है)।

+0

gmpy के लिए धन्यवाद! मैं इसे Coursera पर एक क्रिप्टो कोर्स के लिए उपयोग कर रहा हूँ। –

+0

जीएमपीवाई 2 पूर्णांक और तर्कसंगत अंकगणितीय के लिए जीएमपी लाइब्रेरी का समर्थन करता है लेकिन जीएमपीवाई 2 एमपीएफआर और एमपीसी पुस्तकालयों द्वारा प्रदान किए गए बहु-सटीक वास्तविक और जटिल अंकगणित के लिए समर्थन जोड़ता है। जीएमपी (जीएनयू एकाधिक प्रेसिजन अंकगणितीय पुस्तकालय) का उद्देश्य सभी ऑपरेंड आकारों के लिए किसी अन्य बिग्नम लाइब्रेरी से तेज़ होना है। http://en.wikipedia.org/wiki/GNU_Multiple_Precision_Arithmetic_Library –

3

जैसा कि पहले से ही बताया गया है, पाइथन आपकी स्मृति की अनुमति के रूप में बड़ी संख्या को संभाल सकता है। मैं बस जोड़ना चाहूंगा क्योंकि संख्याएं बड़ी हो जाती हैं, उन पर सभी परिचालनों की लागत बढ़ जाती है। यह स्ट्रिंग को प्रिंट/कनवर्ट करने के लिए नहीं है (हालांकि यह सबसे धीमा है), दो बड़ी संख्याओं को जोड़ना (बड़ा है कि आपका हार्डवेयर मूल रूप से संभाल सकता है) अब ओ (1) नहीं है।

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