Использовать список вместо генератора, когда:
1) Вам необходимо получить доступ к данным несколько раз раз (т.е. кэшировать результаты, а не пересчитывать их):
for i in outer: # used once, okay to be a generator or return a list
for j in inner: # used multiple times, reusing a list is better
...
2) Вам необходим произвольный доступ (или любой другой доступ, кроме прямого последовательного порядка):
for i in reversed(data): ... # generators aren't reversible
s[i], s[j] = s[j], s[i] # generators aren't indexable
3) Вам необходимо объединить строк (для этого требуется два прохода по данным):
s = ''.join(data) # lists are faster than generators in this use case
4) Вы используете PyPy , который иногда не может оптимизировать код генератора настолько, насколько это возможно при обычных вызовах функций и манипуляциях со списком.