DevGang
Авторизоваться

Python: разница между range и xrange

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

Что такое range и xrange?

В Python 2.x у нас было два основных метода для генерации списка целых чисел в заданном диапазоне.

  • range()
  • xrange ()

Однако в Python 3 xrange() переименован в range().

Следовательно, в Python 3 мы получаем единственную функцию, которая может производить числа из заданного диапазона.

Функция range() в python 3.x - это просто повторная реализация xrange() в python 2.x и она на самом деле работает так же, как xrange.

Если вы используете Python 2.x, тогда разница между xrange() и range () значима для вас.

В чем же была разница в Python 2.x

Две функции диапазона имеют много разных черт. Они могут относиться к производительности, потреблению памяти, скорости и внутреннему дизайну. Каждый из них имеет свою реализацию. Теперь давайте рассмотрим каждое из этих отличий по одному.

Операционная разница

В большинстве случаев и xrange, и range работают одинаково. Они оба дают возможность составить список чисел.

Следовательно, мы можем сказать, что оба схожи с точки зрения функциональности. Давайте сейчас посмотрим несколько примеров:

Выражение range(1, 7, 2) даст результат [1, 3, 5], а xrange(1, 7, 2) - [1, 3, 5]. Следовательно, вы можете сделать вывод, что они имеют сходную схему исполнения и выходные данные.

Возвращаемые значения и тип

Это основной источник различий между функциями xrange и range.

Range() возвращает объект типа list. Например, выражение range(1, 100, 1) создаст диапазон чисел от 0 до 99 и вернет все цифры за один раз.

>>> r = range(1, 100, 1)
>>> type(r)

>>> len(r)
99

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

Объект xrange допускает итерацию, индексацию и метод len(). Вы можете использовать его в цикле for, чтобы обойти и получать числа в каждой итерации.

>>> xr = xrange(1, 100, 1)
>>> type(xr)

>>> xr[0]
1
>>> for it in xr:
...    print(it)
...
1
2
3
...
99

Python xrange vs. range - кто быстрее?

У нас есть модуль timeit в Python для захвата времени выполнения любой функции. Мы будем использовать его в нашем тесте и посмотрим, какой из них быстрее.

Мы выполнили range() в нашем тесте три раза, в пример ниже приведен результат и время, которое потребовалось для выполнения:

>>> import timeit
>>> timeit.timeit('"-".join(str(num) for num in range(10000))', number=10000)
22.56510010000011
>>> timeit.timeit('"-".join(str(num) for num in range(10000))', number=10000)
22.796818399999893
>>> timeit.timeit('"-".join(str(num) for num in range(10000))', number=10000)
24.003325399999994

Мы снова провели один и тот же тест с xrange() три раза и записали время их выполнения.

>>> timeit.timeit('"-".join(str(num) for num in xrange(10000))', number=10000)
20.672853799999984
>>> timeit.timeit('"-".join(str(num) for num in xrange(10000))', number=10000)
20.471903500000053
>>> timeit.timeit('"-".join(str(num) for num in xrange(10000))', number=10000)
20.15995029999999

Из приведенных выше тестов и результатов вы можете оценить, что xrange быстрее, чем стандартная функция диапазона.

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

Вот некоторые факты для вашей справки:

  • Основная проблема со стандартной функцией range() заключается в том, что она потребляет значительный объем памяти, особенно для большего диапазона чисел.
  • Функция xrange() всегда предоставляет следующий элемент по запросу. Это означает, что в памяти одновременно существует только один элемент. Следовательно, он потребляет меньше памяти.

Что предпочесть range или xrange?

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

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

Где предпочтительно использовать xrange()?

  • Когда диапазон имеет более широкий охват, мы рекомендуем использовать xrange(). Это улучшит скорость и потребует меньше памяти.
  • Если вы планируете работать на маломощных устройствах (которые имеют ограничения памяти), тогда с xrange() вы можете не увидеть проблем с буфером.

Где предпочтительно использовать range()?

  • Когда вам приходится часто просматривать список, лучше использовать range(). С xrange() было бы непросто создать экземпляр целочисленного объекта для каждого запроса на индексирование.
  • Если вы используете небольшой диапазон, то использование функции range() - правильная идея.
  • Так как метод range возвращает объект списка, вы можете использовать все его функции. Напротив, xrange предоставляет голый целочисленный объект, который требует индексации.
  • Интересно, что если вы хотите, чтобы ваш код Python 2.x был совместим с версией 3.x, вам также следует использовать метод range.

Совместимость Между Python И Xrange

В Python 3.x функция xrange не существует, тогда как она предоставляет функцию range(). Реальность такова, что название «xrange» изменилось на «range» в Python 3.x.

Таким образом, если вы выполните вызов xrange() в Python 3.x, это вызовет приведенную ниже ошибку.

NameError: name ‘xrange’ is not defined

Кроме того, если вы решите импортировать xrange, даже тогда произойдет следующая ошибка.

ImportError: No module named ‘xrange’

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

#Python
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться