range()
и xrange()
работают для 10-значных чисел. Но как насчет 13-значных цифр? Я ничего не нашел на форуме.
Диапазон и xrange для 13-значных чисел в Python?
Ответ 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)):