在CSP样式进程的异常处理程序中,我需要读取并丢弃通道的全部内容,以便允许阻止发送给它的其他进程完成。界面提供了一个用于接收的生成器,是否有更快的方式来消耗和丢弃生成器的全部内容而不是以下内容?
for _ in chan:
pass
答案 0 :(得分:5)
有一种方法稍快:
collections.deque(chan, maxlen=0)
但是,您的代码会使意图更加清晰,因此您应该衡量是否存在明显差异。我几乎总是喜欢你的代码。
(我永远不会使用_
作为变量名称。它往往会混淆人们,在交互式shell中与_
冲突,并与常见的gettext
别名冲突。)
修改:以下是一些简单的时间:
In [1]: import collections
In [2]: a = range(100000)
In [3]: timeit reduce(lambda _, __: None, a)
100 loops, best of 3: 13.5 ms per loop
In [4]: timeit for dummy in a: pass
1000 loops, best of 3: 1.75 ms per loop
In [5]: timeit collections.deque(a, maxlen=0)
1000 loops, best of 3: 1.51 ms per loop
答案 1 :(得分:1)
我已经开始使用deque,如果需要我可以重复使用:
do_all = deque(maxlen=0).extend
然后我可以使用:
来使用生成器表达式do_all(poly.draw() for poly in model.polys)
答案 2 :(得分:0)
您可以尝试:
reduce(lambda _, __: None, chan)
但老实说,我认为你不会比普通循环做得更好。 “渠道”表明I / O无论如何都会成为瓶颈。