Roman_Zhuravskiy
@Roman_Zhuravskiy

Зачем в python range() если есть xrange()?

Прочитал
range(start,stop,step) или xeange(start,stop,range). Где start,stop и step соответственно: начальное, конечное значения и шаг. Однако, если range возвращает список значений (list), xrange возвращает объект, что более эффективно использует память и более производительно в циклах.


На многих ресурсах рекомендуют использовать xrange(), подскажите в каких случаях нужно использовать именно range() если xrange() настолько хорош?
  • Вопрос задан
  • 23128 просмотров
Решения вопроса 1
@Vladisus
По большей части, xrange и range одинаковые с точки зрения функциональности. Они оба обеспечивают способ создания списка целых чисел. Разница лишь в том, что range возвращает список и xrange возвращает объект xrange.

Что это значит? Хороший вопрос! Это означает, что xrange на самом деле не генерируют статический список во время выполнения, как range. Он создает значения, как только они вам нужны специальным методом, называемым yielding. Эта методика используется с типом объекта, известного как генераторы. Если вы хотите прочитать более подробно о генераторах обратится к google.

Хорошо, теперь, что это значит? Еще один хороший вопрос. Это означает, что если у вас есть действительно гигантский диапазон для котого вы хотите создать список, скажем, один миллиард, нужно использовать xrange.

Если вы хотите пройти по списку несколько раз, то, вероятно, лучше использовать range. Так как xrange должен сгенерировать целое число каждый раз, когда вы обращаетесь к индексу, в то время как range статический список и значения уже "там" и готовы к использованию.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Kademn
@Kademn
Злой
Сначала было слово и слово было Python... бла бла бла....
А потом добавили range, который создавал всю последовательность натуральных чисел в памяти и это было хорошо, так как можно было их итерировать.
А потом добавили xrange, который не добавлял весь набор в памяти, а вычислял следующий элемент, ничего не зная про остальные (предыдущие и последующие элементы), почти ничего не занимая в памяти. Так появились генераторы. И поняли, что генераторы это хорошо, отделили генераторы от итераторов и стало так.
А потом Девид Бизли на Пайконе 2008, высеченными на камне презентациями... ой я увлекся.
Ответ написан
Комментировать
bobrovskyserg
@bobrovskyserg
range в Python3 == xrange в Python2 ( а от объекта с именем xrange вовсе отказались). Делаем выводы.
Единственное преимущество range (в Python2) - в следующем примере:

# хочу получить лист [0, 1, 2, 3, 4]
l = range(5)  # в Python3 так нельзя
# то же самое
l = list(xrange(5))   # в Python3  l = list(range(5))
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы