В Python 2.x range
и xrange
ограничены работой с C long
, и ваши большие целые числа слишком велики для этого.Это ограничение просто связано с вариантами реализации, сделанными для range
и xrange
.
В Python 3.x ограничение было снято, и вы можете выполнить range()
с очень большими целыми числами.
>>> range(2**128)
range(0, 340282366920938463463374607431768211456)
В официальном списке изменений для Python 3 есть следующее:
range()
теперь ведет себя как xrange()
, используемый для себя, за исключением того, что он работаетсо значениями произвольного размера.Последний больше не существует.
В Python 2.x функция range()
вернула список.Ясно, что нет надежды выделить память для всех элементов для очень больших диапазонов.Функция xrange()
возвращает объект xrange
.Документация описывает его как «непрозрачный тип последовательности, который выдает те же значения, что и соответствующий список, без фактического сохранения их всех одновременно».Далее в документации говорится:
xrange()
предназначен для того, чтобы быть простым и быстрым.Реализации могут налагать ограничения для достижения этой цели.Реализация Python на C ограничивает все аргументы собственными длинными значениями C («короткими» целыми числами Python), а также требует, чтобы количество элементов помещалось в собственные длинные значения C.
Это объясняет ограничения в Python2.x.
Я не совсем уверен, что вы можете сделать с новой поддержкой Python 3 для очень больших диапазонов.Например, я бы не рекомендовал вам попробовать это:
2**128 in range(2**128)
Это будет работать долго.
В комментариях вы указываете, что пишете код для подсчетак большому количеству.Вы можете сделать это тривиально в Python с помощью следующего кода:
i = 0
while i<N:
doSomething(i)
i += 1
Но вы обнаружите, что если N
большое число, то это займет очень много времени.По вашему вопросу не обойтись без значений N
порядка 2 18 .