Вопрос-Ответ

What is the difference between range and xrange functions in Python 2.X?

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

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

for i in range(0, 20):
for i in xrange(0, 20):
Переведено автоматически
Ответ 1

В Python 2.x:


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



  • xrange это объект sequence, который вычисляется лениво.



В Python 3:


  • range выполняет эквивалент функций Python 2 xrange. Чтобы получить список, вы должны явно использовать list(range(...)).

  • xrange больше не существует.

Ответ 2

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


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


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

list(range(1,100))
Ответ 3

Помните, используйте 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 секунды. И, как указывает Кори, в Python 3.0 xrange() исчезнет и range() в любом случае обеспечит вам хорошее поведение итератора.

Ответ 4

xrange сохраняет только параметры range и генерирует числа по запросу. Однако реализация Python на C в настоящее время ограничивает свои аргументы 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 есть только range и он ведет себя как 2.x xrange, но без ограничений на минимальную и максимальную конечные точки.

python