一尘不染

什么时候不是使用python生成器的好时机?

python

这与您可以使用Python生成器函数做什么相反呢?:python生成器,生成器表达式和itertools模块是这些天我最喜欢的python功能。当设置操作链以对大量数据执行时,它们特别有用-
我在处理DSV文件时经常使用它们。

那么什么时候 不是 使用生成器,生成器表达式或itertools函数的好时机?

  • 我什么时候应该更喜欢zip()itertools.izip(),或者
  • range()xrange()
  • [x for x in foo]结束了(x for x in foo)

显然,我们最终需要通常通过创建列表或使用非生成器循环对其进行迭代来将生成器“解析”为实际数据。有时我们只需要知道长度即可。这不是我要的

我们使用生成器,这样就不会将新列表分配到内存中以存储临时数据。这对于大型数据集尤其有意义。小型数据集也有意义吗?是否存在明显的内存/ CPU权衡?

考虑到列表理解性能与map()和filter()的令人大开眼界的讨论,如果有人对此进行了分析,我特别感兴趣。(alt链接


阅读 144

收藏
2020-12-20

共1个答案

一尘不染

在以下情况下,使用列表而不是生成器:

1)您需要访问数据 的多个 时间(即高速缓存的结果,而不是重新计算它们的):

for i in outer:           # used once, okay to be a generator or return a list
    for j in inner:       # used multiple times, reusing a list is better
         ...

2)您需要 随机访问 (或除正向顺序之外的任何访问):

for i in reversed(data): ...     # generators aren't reversible

s[i], s[j] = s[j], s[i]          # generators aren't indexable

3)您需要 连接 字符串(这需要对数据进行两次传递):

s = ''.join(data)                # lists are faster than generators in this use case

4)您使用的 PyPy 有时无法像正常函数调用和列表操作那样优化生成器代码。

2020-12-20