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

时间:2019-04-05 15:06:34

标签: python async-await generator python-asyncio

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

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

deque(maxlen=0).extend(generator)

1 个答案:

答案 0 :(得分:4)

不是您的问题的答案:

对于普通生成器,deque似乎比for循环快slightly(超过10%)。有人可能会说,使用deque不会带来任何实际优势,并且不值得其不可靠和可能产生的副作用。

但是当我们谈论异步编程时,它变得更加重要。单词async告诉我们,这个异步生成器内部发生了一些I / O:否则,有no reason首先使该生成器异步。该I / O可能会占用99%的执行时间(请参见this answer,尤其是那里的最后一个代码段)。它将快速迭代优势的10%转变为完全悲惨的事情。

在进行了所有优化之后,我们只是看不到异步for循环和替代方法之间的可测量差异。

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


问题的答案:

deque比for循环工作更快,仅是因为它在C语言中是implemented。没有(我所知道的)可与异步可迭代对象一起使用的类似函数的C实现。因此,如果您不想编写C代码,恐怕async for _ in asyncgen(): pass是您现在唯一的选择。