python - 如何以 ~C 速度排空/耗尽异步发电机?
问题描述
目前我正在使用async for _ in asyncgen(): pass
我正在寻找“快速路线”实现,同步生成器的方法是:
deque(maxlen=0).extend(generator)
解决方案
不是您的问题的答案:
对于普通的生成器,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 代码,恐怕这是您现在唯一的选择。
推荐阅读
- c - 删除 C 中的大小写敏感性
- javascript - 将 promise 和 async 与 socket.io 一起使用不会返回预期结果
- java - 在处理草图中将树莓派的蓝牙重新连接到 HC-06
- c - 字符串文字末尾的空字符
- python - 混合数据类型中的特征选择
- java - Netbeans 11.3“无法在此处执行 Show Javadoc”
- python - Scipy 距离:两个二维数组的每个索引匹配观测值之间的计算
- spring-boot - Spring Cloud Stream - @StremListener 条件
- javascript - 如何从另一个没有未定义属性的对象创建对象
- vuejs2 - vue 删除文件数组项影响其他项的文件输入