Почему range()– это не список (и почему это круто)
Многие думают, что: range(1_000_000) создаёт огромный список чисел в памяти.
Но на самом деле – нет 😎
Что такое range() на самом деле
range() – это специальный объект, который:
· НЕ хранит все числа сразу
· генерирует значения по мере необходимости
· занимает очень мало памяти
Почему это важно
Сравним две конструкции:
numbers = list(range(1_000_000))
и
numbers = range(1_000_000)
Во втором случае память почти не расходуется.
Потому что Python не создаёт миллион объектов заранее.
Как это работает
range() хранит только:
· начало
· конец
· шаг
А нужное число вычисляет «на лету». Поэтому можно спокойно писать:
for i in range(10_000_000):
...
и не бояться, что память мгновенно закончится.
Почему это пример хорошего дизайна Python
Python старается:
· не делать лишнюю работу
· не создавать лишние объекты
· вычислять данные тогда, когда они реально нужны
Это называется ленивыми вычислениями (lazy evaluation).
Где это особенно важно
· обработка больших данных
· ETL-пайплайны
· генерация последовательностей
· работа с файлами
· стриминг данных
Частая ошибка ❌
list(range(...))
Люди часто превращают range в список без необходимости.
А потом удивляются расходу памяти.
Когда список всё-таки нужен
Только если:
нужен случайный доступ с изменением
нужны методы списка
данные действительно должны храниться целиком
Главное правило
Если можно не создавать список — лучше его не создавать.
Вывод
range() – отличный пример того, как Python экономит память и делает код эффективнее без лишней магии.