Python: разница между range и xrange
В программировании на Python у нас есть две функции range() и xrange(), которые генерируют целые числа из заданного начального и конечного значений. Здесь мы обсуждаем основные различия между функциями xrange и range.
Что такое range и xrange?
В Python 2.x у нас было два основных метода для генерации списка целых чисел в заданном диапазоне.
Однако в 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() для обеспечения совместимости между различными версиями.
Описание функции range с примерами для Python 3
Если вы опытный разработчик, или даже новичок, вы, несомненно, слышали о функции Python range() . Но что же она делает? В двух словах, она генерирует список чисел, который обычно используется для работы с циклом for . Существует много вариантов использования. Зачастую, ее используют, когда нужно выполнить действие X раз, где вы можете использовать индекс. В других случаях вам, возможно, понадобится сделать итерацию по списку (или по другому итерируемому объекту), имея доступ к индексу.
Функция range() имеет небольшие отличия в работе на версии Python 2.x и 3.x , тем не менее у них остается одинаковая концепция. К этому вопросу мы доберемся немного позже.
Параметры range: star, stop, шаг
Функция range() принимает три параметра, например:
range(stop)
- stop: количество целых чисел для генерации, начиная с нуля. Например, range(3) == [0, 1, 2] .
range([start], stop[, step])
- start: число начала последовательности.
- stop: генерирует число до данного числа, но не включая его.
- step: разница между каждым числом из последовательности.
- Все параметры должны быть целыми числами.
- Каждый из параметров может быть положительным или отрицательным.
- range() (и Python в целом) основана на индексе 0, означая, что список индексов начинается с 0, а не 1, например. Синтаксис, предоставляющий доступ к первому элементу в списке — mylist[0] . Поэтому, последнее целое число, сгенерированное функцией range() зависит от stop , но не будет включать его. Например, range(0, 5) генерирует целые числа 0, 1, 2, 3, 4, но не включая 5.
Примеры функции range()
Простое применение с циклом for:
>>> # 5 чисел начиная с 0 >>> for i in range(5): print(i) 0 1 2 3 4 >>> # числа с 3 до 6 (не включая его) >>> for i in range(3, 6): print(i) 3 4 5 >>> # числа с 4 до 10 (не включая его) с шагом 2 >>> for i in range(4, 10, 2): print(i) 4 6 8 >>> # числа с 0 до -10 (не включая его) с шагом -2 >>> for i in range(0, -10, -2): print(i) 0 -2 -4 -6 -8А это пример итерации по списку.
>>> my_list = ['один', 'два', 'три', 'четыре', 'пять'] >>> my_list_len = len(my_list) >>> for i in range(0, my_list_len): print(my_list[i]) один два три четыре пятьВ качестве параметра stop мы передали длину списка (5).
Range полезна в итерации с условиями. Рассмотрим примере песни “99 Bottles of Beer on the Wall…” со следующим кодом:
for i in range(99, 0, -1): if i == 1: print('1 bottle of beer on the wall, 1 bottle of beer!') print('So take it down, pass it around, no more bottles of beer on the wall!') elif i == 2: print('2 more bottles of beer on the wall, 2 more bottles of beer!') print('So take one down, pass it around, 1 more bottle of beer on the wall!') else: print(' bottles of beer on the wall, bottles of beer!'.format(i)) print('So take it down, pass it around, more bottles of beer on the wall!'.format(i - 1))Мы получаем следующий результат:
99 bottles of beer on the wall, 99 bottles of beer! So take one down, pass it around, 98 more bottles of beer on the wall! 98 bottles of beer on the wall, 98 bottles of beer! So take one down, pass it around, 97 more bottles of beer on the wall! 97 bottles of beer on the wall, 97 bottles of beer! So take one down, pass it around, 96 more bottles of beer on the wall! . 3 bottles of beer on the wall, 3 bottles of beer! So take one down, pass it around, 2 more bottles of beer on the wall! 2 more bottles of beer on the wall, 2 more bottles of beer! So take one down, pass it around, 1 more bottle of beer on the wall! 1 bottle of beer on the wall, 1 bottle of beer! So take it down, pass it around, no more bottles of beer on the wall!Прекрасно! Наконец-то вы видите настоящую силу Python. Если вы еще немного в замешательстве, рекомендую прочитать статью 99 бутылок пива (Википедия).
range против функций xrange в python
Вы должно быть слышали о функции, известной как xrange() . Эта функция представлена в Python 2.x, и была переименована в range() в Python 3.x. Так в чем же разница? В Python 2.x range() создавала список, а xrange() возвращала итератор — объект последовательности. Мы можем увидеть это в следующем примере:
# Python 3.x >>> range(1) range(0, 1) >>> type(range(1)) range'> # Python 2.x >>> range(1) [0] >>> type(range(1)) list'>В Python 3.x. у функции range() есть свой собственный тип. Говоря языком простых терминов, если вы хотите воспользоваться range() в цикле for , вы сделаете это с легкостью. Однако вы не можете использовать его как объект списка. Например, вы не можете разбить на срезы тип range .
Когда вы используете итератор, каждый цикл оператора for выдает мгновенно последующий номер на лету. В то время как исходная функция range() производит все числа мгновенно, прежде чем цикл for начнет выполняться.
Проблема с исходной функцией range() (в Python 2.x) заключалась в том, что она требовала очень большой объем памяти при создании большого количества чисел. Однако в нем, как правило, можно работать быстрее с небольшим количеством чисел.
Обратите внимание, что в Python 3.x вы все равно можете создать список, передав генератор, возвращенный функции list() . Следующим образом:
Зачем в python range() если есть xrange()?
range(start,stop,step) или xeange(start,stop,range). Где start,stop и step соответственно: начальное, конечное значения и шаг. Однако, если range возвращает список значений (list), xrange возвращает объект, что более эффективно использует память и более производительно в циклах.
На многих ресурсах рекомендуют использовать xrange(), подскажите в каких случаях нужно использовать именно range() если xrange() настолько хорош?
- Вопрос задан более трёх лет назад
- 23052 просмотра
Комментировать
Решения вопроса 1
По большей части, xrange и range одинаковые с точки зрения функциональности. Они оба обеспечивают способ создания списка целых чисел. Разница лишь в том, что range возвращает список и xrange возвращает объект xrange.
Что это значит? Хороший вопрос! Это означает, что xrange на самом деле не генерируют статический список во время выполнения, как range. Он создает значения, как только они вам нужны специальным методом, называемым yielding. Эта методика используется с типом объекта, известного как генераторы. Если вы хотите прочитать более подробно о генераторах обратится к google.
Хорошо, теперь, что это значит? Еще один хороший вопрос. Это означает, что если у вас есть действительно гигантский диапазон для котого вы хотите создать список, скажем, один миллиард, нужно использовать xrange.
Если вы хотите пройти по списку несколько раз, то, вероятно, лучше использовать range. Так как xrange должен сгенерировать целое число каждый раз, когда вы обращаетесь к индексу, в то время как range статический список и значения уже "там" и готовы к использованию.
Разница между функциями range и xrange в Python 2.X
В Python, особенно в его второй версии, существуют две функции для создания последовательности чисел — это range и xrange . Они играют важную роль в циклах и итерациях.
Обе функции принимают три аргумента: начальное значение, конечное значение и шаг. Например:
range(0, 10, 2) xrange(0, 10, 2)
Оба этих вызова вернут последовательность [0, 2, 4, 6, 8].
Однако важно отметить, что range и xrange работают по-разному. Функция range возвращает список, который содержит всю последовательность чисел сразу. Таким образом, если диапазон, который вы создаете, достаточно большой, range может занять много памяти.
С другой стороны, xrange создает объект, который генерирует каждое число в последовательности по требованию, т.е. по мере итерации. Это называется «ленивой» генерацией, и она более эффективна по памяти, особенно для больших диапазонов.
for i in range(0, 10000000): pass
for i in xrange(0, 10000000): pass
В первом случае, range создаст список из 10 миллионов элементов и сохранит его в памяти, в то время как xrange создаст только одно значение за раз, существенно экономя память.
Важно отметить, что в Python 3 функция xrange была упразднена, и функция range теперь работает так же, как и xrange в Python 2. Это было сделано для упрощения языка и улучшения эффективности использования памяти.
