什么时候不适合使用 python 生成器?

2023-11-24

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

那么什么时候not是使用生成器、生成器表达式或生成器的好时机itertools功能?

  • 我应该选择什么时候zip() over itertools.izip(), or
  • range() over xrange(), or
  • [x for x in foo] over (x for x in foo)?

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

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

鉴于令人大开眼界的讨论,我特别感兴趣是否有人对此进行了一些分析列表理解性能与map()和filter()的比较. (alt link)


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

1)您需要访问数据multiple次(即缓存结果而不是重新计算它们):

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)你需要join字符串(需要两次传递数据):

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么时候不适合使用 python 生成器? 的相关文章