目前我正在使用 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 是您现在唯一的选择。
