Как irange() отличается от range() или xrange()?

Я проходил через Python Generators Wiki, когда я столкнулся с этой страницей RangeGenerator, в которой говорится о irange() -

Это позволит нам итератору над большими пролетами чисел без прибегая к xrange, который представляет собой ленивый список, а не генератор.

Кажется, я не понимаю набор тестов и реализацию, описанную на этой странице. Я знаю, что range() создает список в памяти (с точки зрения Python 2.7), а xrange() является генератором. Как irange() любой другой?

Ответ 1

irange() возвращает тип генератора, который может быть только повторен. Ничего больше. После того, как вы повторили его, генератор исчерпан и не может быть повторен снова.

Python 2 xrange() type и Python 3 range() тип являются типами последовательностей, они поддерживают различные операции, поддерживаемые другими последовательностями, такие как отчетность по их длине, проверка на локализацию и индексирование:

>>> xr = xrange(10, 20, 3)
>>> len(xr)
4
>>> 10 in xr
True
>>> xr[0]
10
>>> xr[1]
13

Вы можете повторять эти объекты более одного раза:

>>> for i in xr:
...     print i,
... 
10 13 16 19
>>> for i in xr:
...     print i,
... 
10 13 16 19

Вы можете даже использовать функцию reversed(), чтобы эффективно перебирать их в обратном направлении:

>>> for i in reversed(xr):
...     print i,
... 
19 16 13 10

Тип Python 3 range() является улучшенной версией xrange(), поскольку он поддерживает больше операций с последовательностями, более эффективен и может обрабатывать значения за пределами sys.maxint (что было бы целым числом long в Python 2).

Он поддерживает срез, например, который приводит к новому объекту range() для разрезанных значений:

>>> r = range(10, 20, 3)
>>> r[:2]
range(10, 16, 3)

Вы можете использовать отрицательные индексы, как вы можете, с другими последовательностями Python, чтобы получить подсчет элементов с конца:

>>> r[-2]
16
>>> r[-2:]
range(16, 22, 3)

и тип поддерживает тестирование для равенства; два экземпляра range() равны, если они дают одинаковые значения:

>>> range(10, 20, 3) == range(10, 21, 3)
True

В Python 2 единственное преимущество, которое может иметь генератор irange(), состоит в том, что он не страдает от ограничения недолговыми целыми числами, которые xrange() подвергаются:

>>> import sys
>>> xrange(sys.maxint)
xrange(9223372036854775807)
>>> xrange(sys.maxint + 1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OverflowError: Python int too large to convert to C long

Ответ 2

irange предоставляет генератор, который не загружает весь результат в память. Скажем, у вас есть range(1, 1000000), если в память будет загружен список из 1000000 номеров, тогда как в случае xrange(1, 1000000) за один раз будет только одно число.