这是相反的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(使用前将#替换为@)