这是 What can you use Python generator functions for? 的倒数。 :python 生成器、生成器表达式和 itertools
模块是我最近最喜欢的一些 python 功能。它们在设置操作链以对大量数据执行时特别有用——我经常在处理 DSV 文件时使用它们。
那么什么时候不是使用生成器、生成器表达式或itertools
函数的好时机?
- 什么时候我应该更喜欢
zip()
而不是itertools.izip()
,或者 range()
覆盖xrange()
,或[x for x in foo]
over(x for x in foo)
?
显然,我们最终需要将生成器“解析”为实际数据,通常是通过创建一个列表或使用非生成器循环对其进行迭代。有时我们只需要知道长度。这不是我要问的。
我们使用生成器,因此我们不会将新列表分配到内存中以存储临时数据。这对于大型数据集尤其有意义。它对小型数据集也有意义吗?是否存在明显的内存/cpu 权衡?
鉴于 list comprehension performance vs. map() and filter() 令人大开眼界的讨论,如果有人对此进行了一些分析,我特别感兴趣。 . (alt link)
最佳答案
在以下情况下使用列表而不是生成器:
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,它有时无法像使用普通函数调用和列表操作那样优化生成器代码。
关于python - 什么时候不适合使用 python 生成器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/245792/