排空或丢弃发电机而不循环?
问题内容:
在用于CSP样式进程的异常处理程序中,我需要读取并丢弃通道的全部内容,以允许其他受阻塞的进程向其发送消息。该界面提供了一个用于接收的生成器,是否有比以下方式更快地消耗和丢弃生成器全部内容的方法?
for _ in chan:
pass
问题答案:
有一种方法稍微快一点:
collections.deque(chan, maxlen=0)
但是,您的代码使意图更加清晰,因此您应该衡量是否存在明显的差异。我几乎总是喜欢您的代码。
(不过,我永远不会将其_
用作变量名。它_
会使人感到困惑,在交互式外壳程序中与通用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