диапазон и xrange для 13-значных чисел в Python? - PullRequest
12 голосов
/ 02 февраля 2010

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

Ответы [ 9 ]

12 голосов
/ 02 февраля 2010

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

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

6 голосов
/ 02 февраля 2010

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

itertools.count(1000000000000)

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

6 голосов
/ 02 февраля 2010

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

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

дает

[100000000000000, 200000000000000, 300000000000000, 400000000000000, 500000000000000, 600000000000000, 700000000000000, 800000000000000, 900000000000000]
2 голосов
/ 02 февраля 2010

Не думаю, что это сработает.Функции типа 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

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

2 голосов
/ 02 февраля 2010

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

>>> xrange(9999999999999)
xrange(9999999999999)

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

1 голос
/ 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

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

1 голос
/ 02 февраля 2010

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

0 голосов
/ 09 июня 2013

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

for i in xrange(2, int((n+1)**0.5)):
0 голосов
/ 02 февраля 2010

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

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

...