Как слить / вытянуть асинхронный генератор на скорости ~ C? - PullRequest
1 голос
/ 05 апреля 2019

В настоящее время я использую async for _ in asyncgen(): pass

Я ищу реализацию "быстрого маршрута", подход для генераторов синхронизации:

deque(maxlen=0).extend(generator)

1 Ответ

4 голосов
/ 05 апреля 2019

Не ответ на ваш вопрос:

Когда речь идет о простых генераторах, deque кажется просто немного быстрее, чем цикл for (более 10%). Можно утверждать, что использование deque не принесет никаких практических преимуществ и не стоит его ненадежности и возможных побочных эффектов.

Но это становится гораздо важнее, когда мы говорим об асинхронном программировании. Word async говорит нам, что внутри этого асинхронного генератора происходит некоторый ввод-вывод: в противном случае не было никакой причины делать этот генератор асинхронным в первую очередь. Этот ввод / вывод, вероятно, занимает более 99% времени выполнения (см. этот ответ и особенно последний фрагмент кода). Это превратит 10% быстрого итеративного преимущества в нечто совершенно убогое.

Мы просто не увидим ощутимой разницы между асинхронным циклическим и альтернативным подходом после всех усилий, приложенных для оптимизации.

Вообще говоря, «преждевременная оптимизация - корень зла», и только «3% критического кода» стоит оптимизировать . Какие 3% можно сказать только после измерений, а когда речь идет об асинхронном программировании, это, вероятно, будут вещи ввода-вывода, а не итерации.


Ответ на ваш вопрос:

deque работает быстрее, чем для цикла только потому, что он реализован в C. Нет (как мне известно) реализации C подобных функций, которые работают с асинхронными итерациями. Поэтому я боюсь, что async for _ in asyncgen(): pass - это единственный вариант, который у вас есть сейчас, если вы не хотите писать код на Си.

...