Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Python: generator, iterator

Почему генераторы позволяют экономить память?

Вопрос проверяет понимание ленивых вычислений, итераторов и того, как выбор структуры данных влияет на потребление памяти.

Короткий ответ

Список создаётся сразу целиком и занимает память под все элементы. Генератор вычисляет следующий элемент только когда его запрашивают. Поэтому память нужна только для текущего состояния генератора, а не для всего набора данных. Это особенно полезно при обработке больших потоков данных или файлов.

Длинный ответ

Определение

Генератор — это итератор, который вычисляет значения лениво и сохраняет только своё текущее состояние (позицию выполнения и локальные переменные).

Что происходит со списком

Если вы строите список, Python:

  1. Вычисляет все элементы

  2. Выделяет память под структуру списка

  3. Хранит ссылки на каждый элемент

Пример:

numbers = [i * i for i in range(10_000_000)]

Здесь в памяти окажется весь список (пусть даже вам нужно первые 10 значений).

Что происходит с генератором

Генератор:

  1. Не вычисляет элементы заранее

  2. Хранит только состояние выполнения (где остановился)

  3. Возвращает элементы по запросу next()

numbers = (i * i for i in range(10_000_000))
first = next(numbers)
second = next(numbers)

Почему это «дешевле» по памяти

Потому что генератору не нужно держать 10 миллионов значений — он держит:

  • текущий i

  • контекст выполнения

  • ссылки на используемые объекты

Практический пример: чтение файла

Плохой вариант для больших файлов:

lines = open("big.log").read().splitlines()

Лучше:

with open("big.log") as f:
    for line in f:
        # обработка строки
        ...

Здесь строки читаются и обрабатываются по мере прохода, не загружая файл целиком.

Компромиссы (важно знать)

Экономия памяти обычно означает:

  1. Нельзя быстро получить длину последовательности

  2. Нельзя «перемотать назад» без пересоздания генератора

  3. Если нужен многократный проход по данным, иногда выгоднее материализовать список

Краткий вывод

Генераторы экономят память за счёт ленивых вычислений: данные не хранятся целиком, а выдаются по мере запроса. Это подходит для больших объёмов данных и потоковой обработки.

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    5

  • Сложность:

    4

Навыки

  • Python

    Python

Ключевые слова

#generator

#iterator

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.