диапазон и xrange для 13-значных чисел в Python?

range() и xrange() работают для 10-значных чисел. А как насчет 13-значных чисел? на форуме ничего не нашел.


person kame    schedule 02.02.2010    source источник
comment
Связано: stackoverflow.com/questions/2128989/ python-len-and-size-of-ints   -  person Mark Byers    schedule 02.02.2010
comment
Что именно ты пытаешься сделать? Зачем нужны такие большие диапазоны?   -  person Mark Byers    schedule 02.02.2010
comment
Я пытаюсь решить эйлеров проект номер 15. Может быть, мне следует задать новый вопрос.   -  person kame    schedule 02.02.2010
comment
Грубая сила - не способ решить задачу №15! Вам придется ждать долго - больше суток, если вы сможете попробовать 1000000 маршрутов в секунду.   -  person John La Rooy    schedule 02.02.2010
comment
Да, у вас могут возникнуть проблемы с 60-секундным проектом Эйлера.   -  person Ramashalanka    schedule 02.02.2010
comment
Как вы думаете, программное обеспечение не всегда важно для решения вопросов проекта Эйлера?   -  person kame    schedule 02.02.2010
comment
Вы можете быть удивлены тем, как много проблем с проектором можно решить с помощью бумаги и карандаша. # 15, вероятно, немного сложно сделать таким образом, если вы действительно не любите умножать вручную, но вы можете легко решить это с помощью простого научного калькулятора.   -  person John La Rooy    schedule 03.02.2010
comment
@gnibbler Отмените коэффициенты при решении № 15 на бумаге, и это довольно просто.   -  person    schedule 03.02.2010
comment
Связанный: stackoverflow.com/questions/1482480/   -  person jfs    schedule 28.02.2010


Ответы (9)


Вы можете попробовать это. Та же семантика, что и у диапазона:

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]

Другим решением может быть использование itertools.islice, как это предлагается в документации от xrange.

person Ricardo Cárdenes    schedule 02.02.2010

Нет проблем с созданием диапазона, если вам не нужны 10 ** 13 элементов, например.

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

дает

[100000000000000, 200000000000000, 300000000000000, 400000000000000, 500000000000000, 600000000000000, 700000000000000, 800000000000000, 900000000000000]
person Ramashalanka    schedule 02.02.2010
comment
Это не работает с xrange, который работает только с 32-битными числами (в 32-битных системах). - person Glenn Maynard; 03.02.2010
comment
Это правда. Моя система 64-битная, поэтому xrange работает только до sys.maxint = 2^63-1 приблизительно 10^19. - person Ramashalanka; 03.02.2010

если вам нужно перечислить целое число, попробуйте использовать itertools:

itertools.count(1000000000000)

он не должен выделять память для списка из 1000000000000 элементов

person dfa    schedule 02.02.2010

Я не думаю, что это сработает. Такие функции, как len, ожидают, что результат уместится в 4-байтовое целое из-за ограничений в реализации cPython.

В Питоне 3.0:

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

Вроде работает, но...

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

См. здесь связанный вопрос.

person Mark Byers    schedule 02.02.2010

На 64-битном Python:

>>> xrange(9999999999999)
xrange(9999999999999)

Я бы не стал использовать range() для 13-значного числа. Моя бедная машина не смогла бы удержать полученный список.

person Ignacio Vazquez-Abrams    schedule 02.02.2010
comment
Я получаю «OverflowError: long int слишком большой для преобразования в int» на Python 2.5, если я попробую это. - person Mark Byers; 02.02.2010
comment
Интересный. У меня тут 2.6. Обновлено. - person Ignacio Vazquez-Abrams; 02.02.2010
comment
Я получаю OverflowError в 2.6.2. - person MAK; 02.02.2010
comment
Ах, может быть, это потому, что я использую 64-битный Python. - person Ignacio Vazquez-Abrams; 02.02.2010

range(x) возвращает список. Списки Python не могут содержать столько элементов. Вы должны использовать xrange() для перебора этих цифр, если вам нужно выполнить триллионы циклов.?

person corn3lius    schedule 02.02.2010

range() и xrange() работают в достаточно последних версиях Python; однако в версии 2.5 или младше вам нужно будет обойти преобразование int в 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

Это не полное решение (оно не обрабатывает отрицательные шаги), но оно должно помочь вам.

person eswald    schedule 02.02.2010

Разница между range() и xrange() заключается в том, что первый возвращает весь список, а второй возвращает генератор, который генерирует каждое число по мере необходимости. Второй должен работать для любого числа, независимо от того, насколько оно велико.

В Python 3.0 функция xrange() исчезла, а функция range() ведет себя так же, как раньше.

person Confusion    schedule 02.02.2010
comment
К сожалению, xrange (в Python 2.7) также не поддерживает long целых чисел. Например: выражение xrange(sys.maxint, sys.maxint+10) вызывает OverflowError: Python int too large to convert to C long - person typeracer; 01.07.2020

Для решения этой задачи вам не нужны такие длинные числа, потому что вам нужны только простые множители, вы можете использовать квадратный корень:

for i in xrange(2, int((n+1)**0.5)):
person vil    schedule 09.06.2013