Core Concept
Генератор — это специальная функция Python, которая использует ключевое слово yield для возврата значений по одному, только когда они запрашиваются. Это называется ленивым вычислением.
Эффективность памяти
- Список хранит все элементы в памяти одновременно, требуя O(n) памяти
- Генератор вычисляет и хранит только одно значение за раз, требуя O(1) памяти
- Это делает генераторы идеальными при работе с большими или бесконечными последовательностями
# Список: все 1 000 000 чисел загружены в память сразу
numbers_list = [x * 2 for x in range(1_000_000)]
# Генератор: каждое число вычисляется только по запросу
numbers_gen = (x * 2 for x in range(1_000_000))
Эффективность вычислений
- Генераторы используют ленивое вычисление — значения вычисляются только по мере обращения к ним
- Это позволяет избежать лишних вычислений, если тебе не нужна вся последовательность
- Особенно полезно, когда возможно раннее завершение (например, поиск первого совпадения)
Когда использовать каждый
- Используй генератор при обработке больших наборов данных, потоковых данных или построении пайплайнов
- Используй список, когда нужен произвольный доступ, данные нужно использовать несколько раз или вся последовательность должна находиться в памяти
Ключевое ограничение
- Генератор можно обойти только один раз — после исчерпания его нужно пересоздать
- Список можно обходить несколько раз без каких-либо проблем
gen = (x for x in range(3))
list(gen) # [0, 1, 2]
list(gen) # [] — генератор исчерпан