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

Mat*_*ner 3 python generator python-3.x

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

for _ in chan:
    pass
Run Code Online (Sandbox Code Playgroud)

Sve*_*ach 5

有一种方法稍快:

collections.deque(chan, maxlen=0)
Run Code Online (Sandbox Code Playgroud)

但是,您的代码会使意图更加清晰,因此您应该衡量是否存在明显差异.我几乎总是喜欢你的代码.

(但我永远不会_用作变量名.它往往会混淆人们,_在交互式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
Run Code Online (Sandbox Code Playgroud)

  • @DavidZaslavsky:这当然很常见.一些实例甚至出现在Python的标准库中.但是"它的共同点"和"它是一种惯例"之间存在差异.并且"它的共同点"和"它是一个好主意"之间肯定存在差异. (5认同)
  • 我想,`_`是一次性变量的通用名称. (3认同)