В чем разница между функциями range и xrange в Python 2.X? - PullRequest
662 голосов
/ 18 сентября 2008

Очевидно, xrange быстрее, но я понятия не имею, почему он быстрее (и нет никаких доказательств, кроме того, что он пока что быстрее), или что кроме этого отличается от

for i in range(0, 20):
for i in xrange(0, 20):

Ответы [ 28 ]

1 голос
/ 24 июля 2017

Все это очень объяснили. Но я хотел увидеть это сам. Я использую python3. Итак, я открыл монитор ресурсов (в Windows!) И сначала выполнил следующую команду:

a=0
for i in range(1,100000):
    a=a+i

, а затем проверил изменения в памяти «Используется». Это было незначительно. Затем я запустил следующий код:

for i in list(range(1,100000)):
    a=a+i

И потребовался большой кусок памяти для мгновенного использования. И я был убежден. Вы можете попробовать это сами.

Если вы используете Python 2X, замените range () на xrange () в первом коде, а list (range ()) на range ().

1 голос
/ 15 января 2014

В отношении требования для сканирования / печати 0-N элементов, диапазон и xrange работает следующим образом.

range () - создает новый список в памяти, принимает от 0 до N элементов (всего N + 1) и печатает их. xrange () - создает экземпляр итератора, который просматривает элементы и сохраняет в памяти только текущий обнаруженный элемент, следовательно, постоянно использует один и тот же объем памяти.

Если требуемый элемент находится в начале списка только тогда, это экономит много времени и памяти.

1 голос
/ 30 мая 2015

Для меньших аргументов разница уменьшается до range(..) / xrange(..):

$ python -m timeit "for i in xrange(10111):" " for k in range(100):" "  pass"
10 loops, best of 3: 59.4 msec per loop

$ python -m timeit "for i in xrange(10111):" " for k in xrange(100):" "  pass"
10 loops, best of 3: 46.9 msec per loop

В этом случае xrange(100) эффективнее всего на 20%.

0 голосов
/ 10 января 2017

range: -range заполнит все сразу. Это означает, что каждое число диапазона будет занимать память.

xrange: -xrange - это что-то вроде генератора, оно появляется, когда вы хотите диапазон чисел, но вы не хотите, чтобы они сохранялись, например, когда вы хотите использовать в for loop.so эффективное использование памяти.

0 голосов
/ 19 августа 2017

Из справки.

Python 2.7.12

>>> print range.__doc__
range(stop) -> list of integers
range(start, stop[, step]) -> list of integers

Return a list containing an arithmetic progression of integers.
range(i, j) returns [i, i+1, i+2, ..., j-1]; start (!) defaults to 0.
When step is given, it specifies the increment (or decrement).
For example, range(4) returns [0, 1, 2, 3].  The end point is omitted!
These are exactly the valid indices for a list of 4 elements.

>>> print xrange.__doc__
xrange(stop) -> xrange object
xrange(start, stop[, step]) -> xrange object

Like range(), but instead of returning a list, returns an object that
generates the numbers in the range on demand.  For looping, this is 
slightly faster than range() and more memory efficient.

Python 3.5.2

>>> print(range.__doc__)
range(stop) -> range object
range(start, stop[, step]) -> range object

Return an object that produces a sequence of integers from start (inclusive)
to stop (exclusive) by step.  range(i, j) produces i, i+1, i+2, ..., j-1.
start defaults to 0, and stop is omitted!  range(4) produces 0, 1, 2, 3.
These are exactly the valid indices for a list of 4 elements.
When step is given, it specifies the increment (or decrement).

>>> print(xrange.__doc__)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'xrange' is not defined

Разница очевидна. В Python 2.x range возвращает список, xrange возвращает объект xrange, который можно повторять.

В Python 3.x range становится xrange Python 2.x, а xrange удаляется.

0 голосов
/ 03 января 2015

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

0 голосов
/ 08 октября 2018

Дополнительно, если do list(xrange(...)) будет эквивалентно range(...).

Так что list медленно.

Также xrange действительно не полностью завершает последовательность

Так вот почему это не список, это xrange объект

0 голосов
/ 18 сентября 2008

См. сообщение , чтобы найти разницу между диапазоном и диапазоном:

Цитировать:

range возвращает именно то, что вы думаете: список последовательных целые числа определенной длины, начинающиеся с 0. xrange, однако возвращает «объект xrange» , который очень похож на итератор

...