Ленивая обработка (lazy evaluation) — ключевая концепция эффективного программирования, когда значения вычисляются только по мере необходимости. Исторически в Python все основные встроенные структуры (списки, кортежи) были "жадными": они заранее создают и помещают в память все элементы. По мере роста объемов данных и задач по обработке потоков возникла потребность в ленивых вычислениях.
Проблема: жадные вычисления приводят к неэффективному использованию памяти и времени там, где можно постепенно получать результаты — например, при фильтрации, преобразовании длинных коллекций или стриминге файлов.
Решение: в Python появилось много инструментов для ленивых вычислений: генераторы, итераторы, а также функции стандартной библиотеки (map, filter, zip, enumerate) и модуль itertools. Все они возвращают не готовые коллекции, а "ленивые" объекты, которые выдают результат по одному значению за раз.
Пример кода:
result = map(lambda x: x * x, range(100)) # вернет генератор-итератор for y in result: print(y) # значения вычисляются по мере итерации import itertools inf = itertools.count(1) for i in inf: if i > 3: break print(i) # 1, 2, 3
Ключевые особенности:
Всегда ли функции map/filter возвращают список в Python3?
Нет, в Python 3 эти функции возвращают итераторы, а не списки. Для получения списка требуется обернуть результат в list().
x = map(int, ['1', '2']) # <map object> list(x) # [1, 2]
Можно ли получить длину результата map без преобразования в список?
Нет, итератор не знает заранее, сколько в нем элементов, пока не пройдет по всем. Нужно вычислить через list(), что отменяет ленивость.
Функция range в Python3 — жадная или ленивая?
Ленивая: range создает "range object" — он "вычисляет" элементы по мере запроса, не храня всю последовательность.
Скрипт обрабатывает огромный CSV-файл, создавая список всех строк через list(open(f)). Сервер "умирает" от нехватки памяти при большом файле.
Плюсы:
Минусы:
Код использует ленивую обработку: проходит по строкам файла итератором for line in open(f), либо обрабатывает их через map/filter без создания промежуточных коллекций.
Плюсы:
Минусы: