2010-02-02 15 views
12

range() और xrange() 10-अंकों के लिए काम करते हैं। लेकिन 13 अंकों की संख्या के बारे में कैसे? मुझे मंच में कुछ भी नहीं मिला।रेंज और xrange?

+0

संबंधित: http://stackoverflow.com/questions/2128989/पायथन-लेन-और-आकार-के-इन्स –

+0

आप वास्तव में क्या करने की कोशिश कर रहे हैं? आपको इतनी बड़ी श्रेणियों की आवश्यकता क्यों है? –

+0

मैं यूलर-प्रोजेक्ट नंबर 15 को हल करने का प्रयास करता हूं। शायद मुझे एक नया प्रश्न पूछना चाहिए। – kame

उत्तर

12

आप इस कोशिश कर सकते की एक सूची के लिए स्मृति को आबंटित नहीं करना चाहिए। सीमा के रूप में एक ही अर्थ विज्ञान:

import operator 
def lrange(num1, num2 = None, step = 1): 
    op = operator.__lt__ 

    if num2 is None: 
     num1, num2 = 0, num1 
    if num2 < num1: 
     if step > 0: 
      num1 = num2 
     op = operator.__gt__ 
    elif step < 0: 
     num1 = num2 

    while op(num1, num2): 
     yield num1 
     num1 += step 

>>> list(lrange(138264128374162347812634134, 138264128374162347812634140)) 
[138264128374162347812634134L, 138264128374162347812634135L, 138264128374162347812634136L, 138264128374162347812634137L, 138264128374162347812634138L, 138264128374162347812634139L] 

एक अन्य समाधान, itertools.islice का उपयोग करेंगे के रूप में xrange के documentation

+1

'itertools.islice' संदर्भ – jfs

2

64-बिट अजगर पर:

>>> xrange(9999999999999) 
xrange(9999999999999) 

मैं एक 13 अंकों की संख्या के लिए range() का उपयोग नहीं होता। मेरी खराब मशीन परिणामी सूची को पकड़ने में सक्षम नहीं होगी।

+0

मुझे 'ओवरफ्लो त्रुटि: int int में कनवर्ट करने के लिए बहुत लंबा int' पाइथन 2.5 अगर मैं कोशिश करता हूं। –

+0

दिलचस्प। मैं यहाँ 2.6 चला रहा हूँ। अपडेट किया गया। –

+0

मुझे 2.6.2 में 'ओवरफ्लो एरर' मिलता है। – MAK

2

मुझे नहीं लगता कि यह काम करेगा। len जैसे कार्यों को सीपीथन कार्यान्वयन में प्रतिबंधों के कारण परिणाम 4 बाइट पूर्णांक में फिट होने की उम्मीद है।

अजगर 3.0 में:

>>> range(9999999999999) 
range(0, 9999999999999) 

ऐसा लगता है कि यह काम करता है, लेकिन ...

>>> len(range(9999999999999)) 
Traceback (most recent call last): 
    File "<pyshell#2>", line 1, in <module> 
    len(range(9999999999999)) 
OverflowError: Python int too large to convert to C ssize_t 

एक संबंधित प्रश्न के लिए here देखें।

6

सीमा बनाने के साथ कोई समस्या नहीं है, जब तक आप 10 ** 13 तत्व नहीं चाहते हैं, उदा।

range(10**14,10**15,10**14) 

देता

[100000000000000, 200000000000000, 300000000000000, 400000000000000, 500000000000000, 600000000000000, 700000000000000, 800000000000000, 900000000000000] 
+0

यह xrange के साथ काम नहीं करता है, जो केवल 32-बिट संख्याओं (32-बिट सिस्टम पर) पर काम करता है। –

+0

यह सच है। मेरा सिस्टम 64-बिट है, इसलिए xrange केवल sys.maxint = 2^63-1 लगभग 10^19 तक काम करता है। – Ramashalanka

1

रेंज (एक्स) एक list.Python को सूचीबद्ध नहीं कर सकते कई तत्व जिनमें देता है। यदि आपको चक्रों के ट्रिलियन करने की आवश्यकता है तो आपको उन अंकों के माध्यम से फिर से चलाने के लिए xrange() का उपयोग करना चाहिए।

1

रेंज() और xrange() पायथन के हाल के पर्याप्त संस्करणों में काम करते हैं; हालांकि, 2.5 या उससे कम में आपको int से लंबे रूपांतरण के आसपास काम करने की आवश्यकता होगी।

def irange(start, stop=None, step=1): 
    if stop is None: 
     stop = long(start) 
     num = 1L 
    else: 
     stop = long(stop) 
     num = long(start) 
    step = long(step) 
    while num < stop: 
     yield num 
     num += step 

यह एक पूर्ण समाधान नहीं है (यह नकारात्मक चरणों को संभाल नहीं करता है), लेकिन यह आपको जाना चाहिए।

6

अगर आप पूर्णांक itertools उपयोग करने का प्रयास की गणना की जरूरत है:

itertools.count(1000000000000) 

यह 1000000000000 तत्वों

0

रेंज() और xrange (के बीच अंतर) में सुझाव दिया है कि पहली रिटर्न पूरी सूची है, जबकि दूसरा एक जेनरेटर देता है जो प्रत्येक नंबर को आवश्यकतानुसार उत्पन्न करता है। दूसरे को किसी भी संख्या के लिए काम करना चाहिए, भले ही कितना बड़ा हो।

पायथन 3.0 में, xrange() गायब हो गया है और रेंज() पहले xrange() जैसा व्यवहार करता है।

+0

' xrange' के लिए +1 मनमाने ढंग से बड़ी संख्या के लिए काम नहीं करता है। –

0

इस समस्या को आप इस तरह लंबे समय तक नंबर की जरूरत नहीं है, क्योंकि आप केवल प्रधानमंत्री कारकों की जरूरत है, तो आप वर्गमूल उपयोग कर सकते हैं की sollution के लिए:

for i in xrange(2, int((n+1)**0.5)): 
संबंधित मुद्दे