Как повысить эффективность выполнения команд

Я видел много разговоров и статей о сопрограмме в python. Они считаются "микропотоками", и я слышал, что они улучшают производительность.

Как сопроводители повышают производительность? Из того, что я видел до сих пор, они однопоточные и выполняются последовательно. Я согласен с тем, что с точки зрения дизайна они довольно элегантны, особенно в приложениях производителей/потребителей.

Я догадываюсь, что мне не хватает смысла. Может кто-нибудь помочь объяснить?

Ответ 1

Coroutines на самом деле не улучшают производительность, за исключением очень ограниченного: многопоточные программы имеют определенные накладные расходы, а сопрограммы обеспечивают некоторую выгоду от потоков, не налагая этих накладных расходов. Однако большинство многопоточных приложений (даже в C-Python с его GIL) выигрывают от перекрытия, когда один поток блокируется при системном вызове и другие потоки могут выполняться: это обычно не происходит с сопрограммами.

Если у вас есть несколько потоков, то обычно перекрывающиеся выигрыши и сопрограммы не приносят никакой выгоды. Если вам понадобятся тысячи потоков, то накладные расходы на потоковую передачу будут намного больше, и в этой ситуации сопрограммы могут дать преимущество, но сокращение количества потоков, вероятно, принесет гораздо большую пользу.

Реальный выигрыш сопрограмм заключается в том, что для производителей/потребительских приложений они значительно упрощают кодирование и, следовательно, быстрее кодируют.

Ответ 2

Это хороший вопрос, он напомнил мне о Дэвида Безли A Любопытный курс по Corouts и Concurrency. Дэвид отлично справляется не только с объяснением того, как сопрограммы работают на Python, но и в тех случаях, когда они действительно находятся в кармане.

Его письмо, похоже, указывает на то, что преимущество в производительности связано с меньшими затратами для выполнения тех же задач, для которых вы обычно используете класс обработчика (см. слайд 51 его презентация).

Так как @Duncan answer предлагает ситуации, когда накладные вопросы (например, имеющие много разных потоков), сопрограммы - выигрыш в производительности, но сопрограммы - это намного больше, чем просто производительность.