在没有循环的情况下排空或丢弃发电机?

时间:2012-02-21 02:52:04

标签: python python-3.x generator

在CSP样式进程的异常处理程序中,我需要读取并丢弃通道的全部内容,以便允许阻止发送给它的其他进程完成。界面提供了一个用于接收的生成器,是否有更快的方式来消耗和丢弃生成器的全部内容而不是以下内容?

for _ in chan:
    pass

3 个答案:

答案 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无论如何都会成为瓶颈。