Skip to main content
 首页 » 编程设计

python之如何以 ~C 速度排空/耗尽异步发电机

2025年05月04日19bjzhanghao

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

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

deque(maxlen=0).extend(generator) 

请您参考如下方法:

不是您问题的答案:

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

但是当我们谈论异步编程时,它变得更加重要。 Word 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 是您现在唯一的选择。