Что верхняя граница функции диапазона() и как я могу продлить его, или альтернативно, что это лучший способ сделать это:python: могу ли я расширить верхнюю границу метода range()?
for i in range(1,600851475143):
Что верхняя граница функции диапазона() и как я могу продлить его, или альтернативно, что это лучший способ сделать это:python: могу ли я расширить верхнюю границу метода range()?
for i in range(1,600851475143):
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
в корпус петли:
PTS' привели меня к этому в xrange питона документы:
Примечание
xrange() предназначена для простой и быстрой . Реализации могут налагать ограничения . Реализация Python для C ограничивает все аргументы родным C longs («короткие» целые числа Python), а также требует , что количество элементов, которые вписываются в нативный C длиной . Если больший диапазон необходим, альтернативный вариант может быть обработаны с помощью модуля itertools:
islice(count(start, step), (stop-start+step-1)//step)
выглядит это ограничение гр питона, в частности.
Это зависит от того, какую версию 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
Вы считаете, что это просто так? Или есть какая-то причина, по которой вам нужно range()
?
x = 1
while x < 600851475143:
// some code
x += 1
Вот ответ, используя 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):
...
Вы знаете, почему вы должны использовать диапазон() вместо xrange()? xrange() быстрее и экономичнее. –
@coonj: в этих статьях говорится, что в некоторых тестах диапазон() был на самом деле на 1% быстрее. Кроме того, xrange() был удален в Python 3, я думаю. –
@coonj Иногда вам действительно нужен список чисел, а не итератор по этим числам. Например, deck = range (52); random.shuffle (дека); hand = deck [: 5] С другой стороны, использование диапазона, когда все, что вам действительно нужно, - это итератор над числами 1..n действительно расточительно, и именно там происходит переход. –