首页 > 解决方案 > 如何以 ~C 速度排空/耗尽异步发电机?

问题描述

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

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

deque(maxlen=0).extend(generator)

标签: pythonasync-awaitgeneratorpython-asyncio

解决方案


不是您的问题的答案:

对于普通的生成器,deque似乎比 for-loop快(超过 10%)。有人可能会争辩说,使用deque不会带来任何实际优势,也不值得它的不可靠性和可能的​​副作用。

但是当我们谈论异步编程时,它变得更加重要。Wordasync告诉我们在这个异步生成器内部发生了一些 I/O:否则一开始就没有理由让这个生成器异步。此 I/O 可能会占用 99% 的执行时间(请参阅此答案,尤其是那里的最后一个代码片段)。它将 10% 的快速迭代优势转化为完全悲惨的东西。

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

一般来说,“过早的优化是万恶之源”,只有“3%的关键代码”值得优化。哪 3% 只能在测量之后才能说出来,而当涉及到异步编程时,它可能是 I/O 的东西,而不是迭代。


回答您的问题:

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


推荐阅读