2009-05-08 3 views

ответ

9

range(1, 600851475143) хочет создать очень большой список в памяти, и вы Вы получите ошибку в памяти. Чтобы сохранить память, используйте xrange вместо range. К сожалению, xrange не работает с большими числами (это ограничение по реализации) Пример (поднимает OverflowError):

for i in xrange(1, 600851475143): 
    print i 

Вы можете иметь большие минимальные или максимальные значения в вашем интервале с range, если их разница невелика. Пример:

x = 1 << 200 
print list(xrange(x, x + 3)) 

Выход:

[1606938044258990275541962092341162602522202993782792835301376L, 1606938044258990275541962092341162602522202993782792835301377L, 1606938044258990275541962092341162602522202993782792835301378L] 

Причудливый решение исходной для цикла задачи:

def bigrange(a, b = None): 
    if b is None: 
    b = a 
    a = 0 
    while a < b: 
    yield a 
    a += 1 

for i in bigrange(1, 600851475143): 
    print i 

Менее фантазии решение, которое работает, даже если у вас есть continue в корпус петли:

Ответ 0
+1

Вы знаете, почему вы должны использовать диапазон() вместо xrange()? xrange() быстрее и экономичнее. –

+0

@coonj: в этих статьях говорится, что в некоторых тестах диапазон() был на самом деле на 1% быстрее. Кроме того, xrange() был удален в Python 3, я думаю. –

+1

@coonj Иногда вам действительно нужен список чисел, а не итератор по этим числам. Например, deck = range (52); random.shuffle (дека); hand = deck [: 5] С другой стороны, использование диапазона, когда все, что вам действительно нужно, - это итератор над числами 1..n действительно расточительно, и именно там происходит переход. –

2

PTS' привели меня к этому в xrange питона документы:

Примечание

xrange() предназначена для простой и быстрой . Реализации могут налагать ограничения . Реализация Python для C ограничивает все аргументы родным C longs («короткие» целые числа Python), а также требует , что количество элементов, которые вписываются в нативный C длиной . Если больший диапазон необходим, альтернативный вариант может быть обработаны с помощью модуля itertools: islice(count(start, step), (stop-start+step-1)//step)

выглядит это ограничение гр питона, в частности.

0

Это зависит от того, какую версию Python вы используете. Я использую 2.5.2, и xrange вызывает исключение OverflowError для больших чисел. Одним из решений является создание собственного генератора.

def g(start, stop): 
    i = start 
    while i < stop: 
     yield i 
     i += 1 

x = 1<<200 
for i in g(x, x+3): 
    print i 
1

Вы считаете, что это просто так? Или есть какая-то причина, по которой вам нужно range()?

x = 1 
while x < 600851475143: 
    // some code 
    x += 1 
0

Вот ответ, используя itertools.Это немного надуманный, но это работает:

from itertools import repeat, count, izip 
for i,_ in izip(count(1), repeat(1, 600851475143)): 
    ... 

Другой ответ был бы написать свой собственный генератор:

def my_xrange(a, b): 
    while a < b: 
     yield a 
     a += 1 

for i in my_xrange(1, 600851475143): 
    ... 
Смежные вопросы