Вы фильтруете большой поток строк rows. Почему генератор def valid(rows): for row in rows: if is_valid(row): yield row часто лучше по памяти, чем [row for row in rows if is_valid(row)]?

AПотому что yield автоматически кэширует все строки на диске.
BПотому что list comprehension нельзя использовать в for.
CПотому что генератор отдаёт элементы по одному и не хранит весь результат сразу в памяти.
DПотому что генератор гарантированно работает быстрее списка в любом случае.
Правильный ответ. Генератор через yield — потоковый: позволяет обрабатывать данные постепенно без полной материализации.

Разбор

List comprehension создаёт список всех валидных строк сразу, что может быть дорого по памяти. Генератор с yield выдаёт элементы по одному, поэтому вы можете сразу передавать их в следующий шаг пайплайна (for row in valid(rows): ...) без хранения всего набора. Это типичный приём для экономии памяти на больших логах.

Проверь себя · 1/3разбор после ответа
Что произойдёт при выполнении it = iter([]) и затем next(it)?
Тренировать Python в Telegram

Ещё вопросы по теме «Итераторы и генераторы»