Что обычно верно про (row for row in rows) по сравнению с [row for row in rows], если rows — большой поток данных?

AОба варианта создают список одинакового размера в памяти и ведут себя идентично при повторных проходах
BГенераторное выражение быстрее списка независимо от характера данных и числа проходов по результату
CСписок нельзя итерировать повторно, а генератор перематывается к началу любое количество раз без ограничений
DГенераторное выражение вычисляет элементы лениво и экономит память, но результат одноразовый: после прохода исчерпан
Правильный ответ. Генератор — ленивый и потоковый, список — материализованный и подходит для повторных проходов.

Разбор

Списочное включение [row for row in rows] создаёт весь список сразу и хранит его в памяти. Генераторное выражение (row for row in rows) возвращает итератор, который выдаёт элементы по мере запроса, поэтому чаще экономит память на больших данных. Но генератор нельзя «перемотать»: после одного прохода он исчерпывается. Списки одинакового размера — миф; «всегда быстрее» — слишком сильное утверждение; повторно итерировать можно как раз список, а не генератор.

Проверь себя · 1/3разбор после ответа
Дан генератор: def gen(): print("A"); yield 1; print("B"); yield 2. Сразу после g = gen() что будет выведено в консоль?
Тренировать Python в Telegram

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