Каково различие между range и xrange в python?

Я вижу, что они производят тот же результат: это различие в скорости? Почему есть 2 функции для того же самого?

> range(5)
[0, 1, 2, 3, 4]
>>> xrange(5)
xrange(5)
>>> for i in range(5):
...     print i
... 
0
1
2
3
4
>>> for i in xrange(5):
...     print i 
... 
0
1
2
3
4
13
задан 21.02.2016, 21:07
3 ответа

Если, range и xrange они производят тот же результат, но различной формы.

Основания

Как уже habrás смогший угадать функция range возврати список:

>>> type(range(10))
list

Функция range займет количество памяти согласно размеру ранга, которую ты переместишь его как параметр.

С другой стороны функция xrange возврати ваш собственный тип информации, xrange-type:

>>> type(xrange(10))
xrange

Так как нет многой науки за xrange, в самом деле у него нет никакого различия относительно range относительно исполнения, преимущество - что xrange всегда он займет то же количество памяти (ОЗУ), не импортируя размера ранга:

The xrange type is an immutable sequence which is commonly used for looping. The advantage of the xrange type is that an xrange object will always take the same amount of memory, не matter the size of the range it represents. There пахал не consistent выступление advantages.

Вкратце, конечная цель обоих функций состоит в том, чтобы возвращать списки, но мы могли бы говорить, что xrange он это делает в требование из-за Вашей "слабой" природы или "lazy".

Iteradores

В обоих случаях имеется опора для протокола повторения, так как два обладают методом __iter__:

>>> r = range(10)
>>> r
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> r.__iter__
<method-wrapper '__iter__' of list object at 0xb603fdcc>

>>> xr = xrange(10)
>>> xr
xrange(10)
>>> xr.__iter__
<method-wrapper '__iter__' of xrange object at 0xb600e4d0>

А следовательно следующие случаи эквивалентные:

>>> for item in r:
...     print item
...
0
1
2
3
4
5
6
7
8
9
>>> for item in r.__iter__():
...     print item
...
0
1
2
3
4
5
6
7
8
9

То же самое alpica для xr. Большое различие, - что, повторив на r ты это делаешь на списке, который уже был оценен заблаговременно (и был загружен в памяти), и повторив на xr ты это делаешь на "слабом" списке, который перемещает тебя стоимость пока ты нуждался в них (загружая в памяти один одновременно).

Сейчас это может не иметь много чувство с рангом 10 целых чисел, но попробуй это с какими-то миллионами и ты заметишь различие в твоей памяти ОЗУ.

Генераторы

Что это не часть начального вопроса, но мне показалось соответствующим добавлять это к ответу, так как генераторы - объекты, которые в конце концов осуществляют протокол повторения.

Они похожие на списки понимания, но создаются используя скобку вместо квадратных скобок.

Примеры:

>>> lista = [1, 2, 3, 4, 5]
>>> [x**2 for x in lista]
[1, 4, 9, 16, 25]
>>> (x**2 for x in lista)
<generator object <genexpr> at 0xb60427fc>

Сейчас, генераторы функционируют похожей формы в xrange так как они также "слабые" и только возвращают стоимость пока ты нуждался в этом, не загружая всего в памяти посредством использования выражения yield.

Ссылки

16
ответ дан 24.11.2019, 14:51
  • 1
    большое спасибо степень магистра!! Ужасный ответ!! – Andrés Muñoz 22.02.2016, 08:25
  • 2
    Учитель К и # 233; sar, не забывай использовать espa и # 241; ol, вместо " performance" давайте использовать desempe и # 241; или: D – SalahAdDin 10.03.2016, 03:00
  • 3
    @SalahAdDin у тебя есть raz и # 243; n! Плохие привычки - м и # 225; s dif и # 237; ciles оставления: D – César 10.03.2016, 14:00
  • 4
    Desempe и # 241; или или результат:) – astrojuanlu 23.03.2016, 13:57

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

Пример:

Для x в range(10000): Он произведет список 10 тысяч элементов и тогда пробежит каждый из них одновременно.

Для x в xrange(10000): Он произведет 10 тысяч целых чисел один из-за одного, перемещая каждый в переменную x одновременно.

Ссылка

9
ответ дан 24.11.2019, 14:51

В python2, это различные функции и себе объясняет достаточно добра в документации xrange Ваши минимальные различия: xrange произведи объект xrange, и range произведи список. Преимущество объекта XRange дело в том, что он не нуждайся в том, чтобы произвести все элементы пока он не был необходим, что предполагает важное сбережение ресурсов. Кроме того, в осуществлении CPython (которое самое общее python) возможно оптимизировать намного лучше и проще этот тип циклов.

С Python3 прекращает быть две функции объединяясь в единственной функции range что был бы эквивалентным функции xrange python2. Чтобы получать список необходимо призывать строитель списков (eg: list(range(1000)))

6
ответ дан 24.11.2019, 14:51