python: могу ли я расширить верхнюю границу метода range ()? - PullRequest
3 голосов
/ 09 мая 2009

Какова верхняя граница функции range () и как я могу ее расширить, или, альтернативно, как лучше всего это сделать:

for i in range(1,600851475143):

Ответы [ 5 ]

9 голосов
/ 09 мая 2009

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:

i = 1 - 1
while i < 600851475143 - 1:
  i += 1
  print i
2 голосов
/ 09 мая 2009

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

x = 1
while x < 600851475143:
    // some code
    x += 1
2 голосов
/ 09 мая 2009
Ответ

pts привел меня к этому в документации по xrange python:

Примечание

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

похоже, что это ограничение c Python в частности.

0 голосов
/ 10 мая 2009

Вот ответ, используя 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):
    ...
0 голосов
/ 09 мая 2009

Это зависит от того, какую версию 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...