Разница не в использовании памяти в принципе. А в использовании оперативной памяти, которой меньше.
Рассмотрим кейс: у нас есть набор записей общим объемом 1ТиБ на винте, надо перебрать все и посчитать, скажем, среднее.
Если у нас есть 1ТиБ свободной оперативы - мы можем целиком загрузить все туда и прямым доступом перебрать массив.
Но у нас вряд ли есть столько оперативы. В таком случае мы можем считывать данные блоками размером с доступную оперативную память, выполнять действие, выгружать блок и загружать следующий.
Генераторы же - синтаксический сахар для таких операций. Можно написать функцию-генератор, которая будет при каждом вызове возвращать следующий элемент. Но не хранить все их в оперативе. Отсюда и экономия памяти, но именно оперативной.