Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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 документации

Ответ 2

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

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

дает

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

Ответ 3

если вам нужно перечислить целое число с помощью itertools:

itertools.count(1000000000000)

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

Ответ 4

В 64-битном Python:

>>> xrange(9999999999999)
xrange(9999999999999)

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

Ответ 5

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

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

См. здесь для соответствующего вопроса.

Ответ 6

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

Ответ 7

range() и xrange() работают в последних версиях Python; однако, в 2.5 или менее вам нужно будет обойти int для длительного преобразования.

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

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

Ответ 8

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

В Python 3.0 xrange() исчез, а range() ведет себя как xrange() ранее.

Ответ 9

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

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