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

标签 python optimization iterator generator

这是 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/

相关文章:

python - 正则表达式:特殊字符之间的数字(但不是所有数字)

python - 关闭pycharm容器的正确方法

java - Guava 库中的 Iterators.any

python - 如何让这个过程更快?

C++: vector "corrupting"的第一个元素

c++ - 为什么我的模板化函数需要从一个迭代器到另一个迭代器的转换?

python - BeautifulSoup : Only target elements if a specific child has a certain class

python - 如何使 tkinter 按钮与我的脚本交互?

javascript - 如何使用map()和find()方法搜索对象数组中的最小值?

ios - 放大 UIScrollView 时未调用 scrollViewDidEndZooming