Вы всегда должны отдавать предпочтение xrange (), а не range ()? - PullRequest
454 голосов
/ 25 сентября 2008

Почему или почему нет?

Ответы [ 12 ]

2 голосов
/ 10 сентября 2016
  • range(): range(1, 10) возвращает список от 1 до 10 номеров и сохраняет весь список в памяти.
  • xrange(): Как и range(), но вместо возврата списка возвращает объект, который генерирует числа в диапазоне по требованию. Для циклов это немного быстрее, чем range() и более эффективно использует память. xrange() объект похож на итератор и генерирует числа по требованию (Lazy Evaluation).
In [1]: range(1,10)
Out[1]: [1, 2, 3, 4, 5, 6, 7, 8, 9]

In [2]: xrange(10)
Out[2]: xrange(10)

In [3]: print xrange.__doc__
Out[3]: xrange([start,] stop[, step]) -> xrange object

range() делает то же самое, что xrange(), используемый в Python 3, и в Python 3 нет термина xrange(). range() на самом деле может быть быстрее в некотором сценарии, если вы повторяете одну и ту же последовательность несколько раз. xrange() должен каждый раз восстанавливать целочисленный объект, но range() будет иметь реальные целочисленные объекты.

2 голосов
/ 25 сентября 2008

Ладно, здесь у всех разные мнения относительно компромиссов и преимуществ xrange по сравнению с диапазоном. Они в основном правильные, xrange - итератор, а диапазон расширяется и создает реальный список. В большинстве случаев вы не заметите разницу между ними. (Вы можете использовать карту с диапазоном, но не с xrange, но она использует больше памяти.)

Однако я думаю, вы хотите услышать, что предпочтительным вариантом является xrange. Поскольку range в Python 3 является итератором, инструмент преобразования кода 2to3 правильно преобразует все варианты использования xrange в range и выдает ошибку или предупреждение при использовании range. Если вы хотите в будущем легко конвертировать код, вы будете использовать только xrange и list (xrange), когда уверены, что хотите получить список. Я узнал об этом во время спринта CPython на PyCon в этом году (2008) в Чикаго.

...