python - 列表上的生成器与链接生成器和内存消耗?

标签 python generator

<分区>

谁能解释一下生成器在这些示例中的工作原理?

在这个例子中来自 http://www.dabeaz.com/generators/index.html

wwwlog = open("access-log")
bytecolumn = (line.rsplit(None,1)[1] for line in wwwlog)
bytes = (int(x) for x in bytecolumn if x != '-')
print "Total", sum(bytes)
  1. 当我们像这样链接生成器时,除了代码对象创建之外,在我们执行 sum() 之前是否会发生任何实际工作?
  2. 为什么我们需要做 line.split(None,1)[1] 和 int(x) 分开 - 这样做有优势吗?

在这个例子中(x*x for x in range(1,100000000))

  1. 当这个表达式被解释器求值时,Python 2 是否计算了 range(1,100000000)?
  2. 在这条语句期间或在生成器的第一次运行期间发生这种情况吗
  3. 这在 Python 3 中有什么不同吗?

原因我怀疑是这个片段:

def foo():
    for each in range(1,100000):
      yield each

a = foo()

# Here range is not evaluated until generator is run or just 
# before first yield is hit which is expected.

a=(x for x in range(1,100000)) 

# I thought also does exact thing as that function and it i is a 
# syntactic sugar for a=foo() which also yields a generator object.

与使用列表或更实用的场景相比,使用生成器是否有任何优势?

最佳答案

  1. 生成器是惰性的,因此在您遍历它们之前什么也不会发生(例如使用 sum)。
  2. 它只是让它更具可读性。如果你想,你可以这样写: bytes = (int(x) for x in (line.rsplit(None,1)[1] for line in wwwlog) if x != '-')
  3. 是的,在 Python 2 中 range 返回一个列表,您需要 xrange 来生成类似生成器的对象。
  4. 它是在迭代生成器时计算的,直到那时什么都不做。
  5. 是的,在 Python 3 中 range 的行为类似于 Python 2 的 xrangemapfilter 等其他函数也发生了同样的事情。

生成器的主要优点是它们不会一次存储全部内容。它们的主要缺点是您只能迭代一次。

关于python - 列表上的生成器与链接生成器和内存消耗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27755228/

相关文章:

javascript - 生成随机颜色偏差

python - 恢复 python 生成器的定义表达式

python - 带有 Python Decorator 的函数中的静态变量

python - 为什么 class.__weakref__ 不是 None,而 instance.__weakref__ 是 None?

python - connection.commit() 性能影响

python - Opencv和python - 两行之间的阴影区域

python - 如何就地对列表的一部分进行排序?

python - Keras Fit_generator 回调

node.js - 使用生成器的 Mocha 代码覆盖率

python - 我可以记住一个 Python 生成器吗?