2010-02-02 13 views
12

range() e xrange() funzionano per numeri a 10 cifre. Ma che ne dici di numeri a 13 cifre? Non ho trovato nulla nel forum.intervallo e xrange per numeri a 13 cifre in Python?

+0

correlati: http://stackoverflow.com/questions/2128989/python-len-and-size-of-ints –

+0

Che cosa stai cercando di fare esattamente? Perché hai bisogno di intervalli così grandi? –

+0

Provo a risolvere il progetto numero 15 di eulero. Forse dovrei fare una nuova domanda. – kame

risposta

12

si potrebbe provare questo. Stessa semantica gamma:

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] 

Un'altra soluzione sarebbe utilizzando itertools.islice, come suggerito in xrange s' documentation

+1

+1 per il riferimento 'itertools.islice' – jfs

2

a 64 bit Python:

>>> xrange(9999999999999) 
xrange(9999999999999) 

Non vorrei usare range() per un numero a 13 cifre. La mia povera macchina non sarebbe in grado di contenere la lista risultante.

+0

Ottengo 'OverflowError: long int troppo grande per convertire in int' on Python 2.5 se provo questo. –

+0

Interessante. Sto eseguendo 2.6 qui. Aggiornato. –

+0

Ottengo 'OverflowError' in 2.6.2. – MAK

2

Non penso che funzionerà. Funzioni come len si aspettano che il risultato si adatti a un intero di 4 byte, a causa delle restrizioni nell'implementazione cPython.

In Python 3.0:

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

Sembra che funziona, ma ...

>>> 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 

Vedi here per una questione connessa.

6

Nessun problema con la creazione dell'intervallo, purché non si desideri 10 ** 13 elementi, ad es.

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

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

Questo non funziona con xrange, che funziona solo su numeri a 32 bit (su sistemi a 32 bit). –

+0

È vero. Il mio sistema è a 64 bit, quindi xrange funziona solo su sys.maxint = 2^63-1 circa 10^19. – Ramashalanka

1

gamma (x) restituisce un list.Python elenca gergo contengono che molti elementi. Dovresti usare xrange() per scorrere queste cifre se hai bisogno di fare trilioni di cicli.

1

range() e xrange() funzionano in versioni abbastanza recenti di Python; tuttavia, in 2.5 o meno dovrai aggirare la conversione da int a long.

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 

Questa non è una soluzione completa (non gestisce fasi negative), ma dovrebbe farti andare.

6

se avete bisogno di enumerazione intero provare a utilizzare itertools:

itertools.count(1000000000000) 

non dovrebbe allocare memoria per un elenco di elementi 1000000000000

0

La differenza tra range() e xrange() è che i primi restituisce l'intero elenco, mentre il secondo restituisce un generatore che genera ogni numero in base alle necessità. Il secondo dovrebbe funzionare per qualsiasi numero, non importa quanto grande.

In Python 3.0, xrange() è scomparso e range() si comporta come xrange() in precedenza.

+0

' xrange' non funziona per numeri arbitrariamente grandi. –

0

Per sollution di questo problema che non è necessario un numero così a lungo, perché è necessario solo fattori primi, è possibile utilizzare radice quadrata:

for i in xrange(2, int((n+1)**0.5)): 
Problemi correlati