Для провторного использования кода генераторы как раз подходят.
В частности, они позволяют использовать полиморфизм, в едином интерфейсе обращаться как к изначально итерируемым ресурсам, так и к потокам.
А вот "для оптимизации потребления памяти" генераторы
не подходят от слова "совсем".
Я не в первый раз уже вижу на Тостере эту чушь, и очень хотел бы знать, кто эту идиотскую мульку здесь запустил.
Синтаксический сахар, которым, по сути, является генератор, никогда
никакого отношения к потреблению ресурсов не имеет.
Ресурсы всегда экономит (или не экономит) тот код, который мы заворачиваем в генератор. Но сам он вообще не при делах. Всё, что "наэкономит" генератор, можно сэкономить и без него.
"Большой массив"
уже сожрал кучу памяти, и экономить тут уже нечего. Поздно пить Боржоми, когда почки отказали.
Память экономит получение данных из внешнего источника не целиком, а по одному элементу
А генератор всего лишь может
замаскировать такое получение под работу с массивом.
В моем коде требуется несколько раз переиспользовать foreach вложенный в foreach.
Скорее всего генератор здесь будет бессмысленным.
Чтобы понять, насколько здесь нужна какая-либо оптимизация, надо привести ИСХОДНЫЙ код, про который вдруг в голову ударила идея что его надо обязательно "оптимизировать"