What is the difference between range and xrange functions in Python 2.X?
В чем разница между функциями range и xrange в Python 2.X?
Очевидно, что xrange быстрее, но я понятия не имею, почему это быстрее (и пока нет доказательств, кроме анекдотических, что это быстрее) или что, кроме этого, отличается от
for i inrange(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, но без ограничений на минимальную и максимальную конечные точки.