До каких пор использовать генераторы?

Привет.

Я сейчас нахожусь на той стадии любви к генераторам, что использую их сильно чаще, чем списки. Буквально везде одни yield и yield from

Списки использую только в том случае, если нужно проитерироваться по последовательности один раз, а потом ещё раз. Или если нужно отправить список по API и сделать из него JSON. То есть, даже если итерация около-параллельная, например, с отставанием в пару элементов, я использую itertools.tee

Я знаю, что генераторы медленней списков (хотя, адекватных бэнчей я не смог придумать, потому что генераторы ленивые и как протестировать именно время, затрачиваемое на yield — непонятно). Хотя, создание списка append'ами плюс его обработка обычно дольше:

5ba240623ccea255460207.png

Я знаю, что почти все списки, которые я бы создал вместо генераторов со свистом влезли бы в память, но я не могу остановиться экономить эту память.

Подскажите советом, когда адекватно использовать генераторы, а когда — глупо?
  • Вопрос задан
  • 629 просмотров
Решения вопроса 1
longclaps
@longclaps
Эк тебя, брат, крючит ))) Можно подумать, что единственое назначение списков - итерироваться по ним )
Но мы-то знаем, что всё как раз наоборот: именно генераторы, чтобы итерироваться, а списки - для произвольного доступа (ну и чтоб итерироваться).
Генераторы не только лишь экономят память, но и расходуют её - на кадр персистентного стека, хотя бы. Так что на мелких списках экономить смысла нет.
И напротив - генераторы могут выигрывать в скорости там, где тяжелое вычисление значений, а итерация может оборваться, не долистав список/генератор до конца.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы