В чем разница между функциями range и xrange в Python 2.X?

Убедитесь, что вы уже закрыли соединение с базой данных или нет. В моем случае я получал ошибку, потому что соединение было близко в верхней строке.

673
задан kmario23 26 November 2014 в 09:17
поделиться

11 ответов

диапазон создает список, поэтому если Вы делаете range(1, 10000000), он создает список в памяти с 9999999 элементы.

xrange объект последовательности, который оценивает лениво.

Это должно быть добавлено от подсказки @Thiago, что в python3, диапазон делает эквивалент xrange

Python
760
ответ дан Marcel H. 26 November 2014 в 09:17
поделиться

Посмотрите этот сообщение для нахождения различия между диапазоном и xrange:

Для заключения в кавычки:

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

-1
ответ дан Kev 26 November 2014 в 09:17
поделиться

xrange использует итератор (генерирует значения на лету), диапазон возвращает список.

2
ответ дан hacama 26 November 2014 в 09:17
поделиться

диапазон генерирует весь список и возвращает его. xrange не делает - он генерирует числа в списке по требованию.

3
ответ дан Eddie Deyo 26 November 2014 в 09:17
поделиться

диапазон создает список, поэтому если Вы делаете range(1, 10000000), он создает список в памяти с 9999999 элементы.

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

Это верно, но в Python 3, .range() будет реализован Python 2 .xrange(). Если необходимо на самом деле генерировать список, необходимо будет сделать:

list(range(1,100))
216
ответ дан Benyamin Jafari 26 November 2014 в 09:17
поделиться

Помните, используйте timeit модуль для тестирования, какой из маленьких отрывков кода быстрее!

$ python -m timeit 'for i in range(1000000):' ' pass'
10 loops, best of 3: 90.5 msec per loop
$ python -m timeit 'for i in xrange(1000000):' ' pass'
10 loops, best of 3: 51.1 msec per loop

Лично, я всегда использую .range(), если я не имел дело с действительно огромные списки - как Вы видите, мудрый временем, для списка миллиона записей, дополнительные издержки составляют только 0,04 секунды. И поскольку Corey указывает, в Python 3.0 .xrange() уйдет, и .range() даст Вам хорошее поведение итератора так или иначе.

108
ответ дан Benyamin Jafari 26 November 2014 в 09:17
поделиться

xrange только хранилища параметрические усилители диапазона и генерирует числа по требованию. Однако реализация C Python в настоящее время ограничивает свой args C longs:

xrange(2**32-1, 2**32+1)  # When long is 32 bits, OverflowError: Python int too large to convert to C long
range(2**32-1, 2**32+1)   # OK --> [4294967295L, 4294967296L]

Примечание, что в Python 3.0 существуют [только 112] и он ведет себя как 2.x xrange, но без ограничений на минимальные и максимальные конечные точки.

64
ответ дан ShadowRanger 26 November 2014 в 09:17
поделиться

xrange возвращает итератор и только сохраняет одно число в памяти за один раз. диапазон сохраняет весь список чисел в памяти.

38
ответ дан Ben Hoffstein 26 November 2014 в 09:17
поделиться

диапазон создает список, поэтому если Вы действительно располагаетесь (1, 10000000), он создает список в памяти с 10 000 000 элементов. xrange является генератором, таким образом, он оценивает лениво.

Это приносит Вам два преимущества:

  1. можно выполнить итерации более длинных списков, не добираясь MemoryError.
  2. , Поскольку это разрешает каждое число лениво при остановке повторения рано Вы не будете напрасно тратить время, создавая целый список.
13
ответ дан ShadowRanger 26 November 2014 в 09:17
поделиться

Действительно проведите некоторое время с Справочное руководство по библиотеке . Чем более знакомы Вы с ним, тем быстрее можно найти ответы на вопросы как это. Особенно важный первые несколько глав о встроенных объектах и типах.

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

Другим способом найти быструю информацию о конструкции Python является docstring и функция справки:

print xrange.__doc__ # def doc(x): print x.__doc__ is super useful
help(xrange)
28
ответ дан Antti Rasinen 26 November 2014 в 09:17
поделиться

Это по причинам оптимизации.

диапазон () создаст список значений от запуска для окончания (0.. 20 в Вашем примере). Это станет дорогой операцией на очень больших спектрах.

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

11
ответ дан QAZ 26 November 2014 в 09:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: