Range и xrange для 13-значных чисел в Python?
range()
и xrange()
работа для 10-значных чисел. Но как насчет 13-значных чисел? Я ничего не нашел на форуме.
9 ответов
вы можете попробовать это. Та же семантика, что и range:
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
' s документация
нет проблем с созданием диапазона, если вы не хотите 10 * * 13 элементов, например
range(10**14,10**15,10**14)
дает
[100000000000000, 200000000000000, 300000000000000, 400000000000000, 500000000000000, 600000000000000, 700000000000000, 800000000000000, 900000000000000]
Если вам нужно перечислить целое число, попробуйте использовать itertools:
itertools.count(1000000000000)
он не должен выделять память для списка 1000000000000
элементов
Я не думаю, что это будет работать. Функции как 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
посмотреть здесь на соответствующий вопрос.
на 64-битном Python:
>>> xrange(9999999999999)
xrange(9999999999999)
Я бы не использовать range()
для 13-значного числа. Моя бедная машина не смогла бы удержать результирующий список.
range (x) возвращает список.Списки Python не могут содержать столько элементов. Вы должны использовать xrange() для итерации через эти цифры, если вам нужно сделать триллионы циклов.?
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
Это не полное решение (оно не обрабатывает отрицательные шаги), но оно должно заставить вас идти.
разница между range() и xrange () заключается в том, что первый возвращает весь список, а второй возвращает генератор, который генерирует каждое число по мере необходимости. Второй должен работать для любого числа, каким бы большим.
в Python 3.0 xrange() исчез, а range() ведет себя как xrange () ранее.
для решения этой задачи вам не нужны такие длинные числа, потому что вам нужны только простые множители, вы можете использовать квадратный корень:
for i in xrange(2, int((n+1)**0.5)):