2010-02-02 3 views
12

range() und xrange() arbeiten für 10-stellige Nummern. Aber wie steht es mit 13-stelligen Zahlen? Ich habe im Forum nichts gefunden.Bereich und Xrange für 13-stellige Zahlen in Python?

+0

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

+0

Was genau versuchen Sie zu tun? Warum brauchen Sie so große Bereiche? –

+0

Ich versuche das Euler-Projekt Nummer 15 zu lösen. Vielleicht sollte ich eine neue Frage stellen. – kame

Antwort

12

Sie könnte versuchen zuweisen soll. Gleiche Semantik wie Bereich:

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] 

Eine andere Lösung itertools.islice verwenden würde, wie in xrange ‚s vorgeschlagen documentation

+1

+1 für 'itertools.islice' Referenz – jfs

2

Auf 64-Bit-Python:

>>> xrange(9999999999999) 
xrange(9999999999999) 

ich nicht range() für eine 13-stellige Nummer verwenden würde. Meine arme Maschine könnte die resultierende Liste nicht halten.

+0

Ich bekomme 'OverflowError: long int zu groß, um in int' on zu konvertieren Python 2.5 wenn ich das versuche. –

+0

Interessant. Ich laufe 2,6 hier. Aktualisiert. –

+0

Ich bekomme 'OverflowError' in 2.6.2. – MAK

2

Ich glaube nicht, dass es funktioniert. Funktionen wie len erwarten, dass das Ergebnis aufgrund von Einschränkungen in der cPython-Implementierung in eine 4-Byte-Ganzzahl passt.

In Python 3.0:

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

Es sieht aus wie es funktioniert, aber ...

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

Siehe here für eine weitere Frage.

6

Keine Probleme mit der Erstellung der Bereich, solange Sie nicht 10 ** 13 Elemente, z.

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

gibt

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

Dies funktioniert nicht mit Xrange, die nur auf 32-Bit-Nummern (auf 32-Bit-Systemen) funktioniert. –

+0

Das stimmt. Mein System ist 64-Bit, so arbeitet xrange nur bis sys.maxint = 2^63-1 ca. 10^19. – Ramashalanka

1

Bereich (x) gibt eine list.Python listet kippe, dass viele Elemente enthalten. Sie sollten xrange() verwenden, um diese Ziffern zu durchlaufen, wenn Sie Billionen von Zyklen ausführen müssen.

1

range() und xrange() arbeiten in den letzten genug Versionen von Python; In 2.5 oder weniger müssen Sie die Konvertierung von int zu long jedoch umgehen.

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 

Dies ist keine vollständige Lösung ist (es ist nicht negativ Schritte umgehen kann), aber es sollte Sie gehen zu bekommen.

6

wenn Sie integer brauchen Aufzählen versuchen itertools mit:

itertools.count(1000000000000) 

es keinen Speicher für eine Liste von 1000000000000 Elemente

0

Der Unterschied zwischen Bereich() und xrange() ist, dass die erste kehrt die gesamte Liste, während Die zweite gibt einen Generator zurück, der jede Zahl so erzeugt, wie sie benötigt wird. Der zweite sollte für jede Zahl funktionieren, egal wie groß sie ist.

In Python 3.0 ist xrange() verschwunden und range() verhält sich wie xrange() zuvor.

+0

' xrange' funktioniert nicht für beliebig große Zahlen. –

0

Für sollution dieses Problem, das Sie so lange Zahlen nicht benötigen, weil Sie nur Primfaktoren benötigen, können Sie Quadratwurzel verwenden:

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