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() для обеспечения совместимости между различными версиями.