如何以〜C速度排空异步发电机?

Sla*_*lam 1 python generator async-await python-asyncio

目前我正在使用 async for _ in asyncgen(): pass

我正在寻找“快速路由”实现,用于同步生成器的方法是:

deque(maxlen=0).extend(generator)
Run Code Online (Sandbox Code Playgroud)

Mik*_*mov 5

无法回答您的问题:

当涉及到普通发电机,deque似乎只是快于环(超过10%)。有人可能会说,使用deque不会带来任何实际优势,并且不值得其不可靠和可能产生的副作用。

但是,当我们谈论异步编程时,它变得更加重要。Word async告诉我们该异步生成器内部发生了一些I / O:否则,没有理由首先使该生成器异步。这个I / O可能要花费99%的执行时间(请参阅此答案,尤其是那里的最后一个代码片段)。它将快速迭代优势的10%转变为完全悲惨的事情。

在所有努力投入优化之后,我们只是看不到异步for循环和替代方法之间的任何可测量差异。

一般来说,“过早的优化是万恶之源”,只有“ 3%的关键代码” 值得优化。只能在测量后说出3%的数据,而对于异步编程,这可能是I / O内容,而不是迭代。


您问题的答案:

deque仅因为它是用C 实现的,所以它比for循环工作得更快。对我而言,尚无与异步可迭代对象类似的功能的C实现。因此,async for _ in asyncgen(): pass如果您不想编写C代码,恐怕现在只有您唯一的选择。