【发布时间】:2016-02-01 13:24:46
【问题描述】:
我不太明白 Python 中迭代器是如何获得内存的。
>>> l1 = [1, 2, 3, 4, 5, 6]
>>> l2 = [2, 3, 4, 5, 6, 7]
>>> iz = izip(l1, l2)
我们仍然需要O(min(l1, l2)) 内存,因为我们需要将列表l1 和l2 加载到内存中。
我认为迭代器的主要用途之一是节省内存——但它在这里似乎没有用。
同样,下面的代码我也不清楚:
>>> l1 = ( n for n in [1, 2, 3, 4, 5, 6] )
>>> l2 = ( n for n in [2, 3, 4, 5, 6, 7] )
>>> iz = izip(l1, l2)
我们需要在将列表转换为生成器之前加载它们,对吧?这意味着我们会浪费内存。那么 - 这里的生成器还有什么意义。
这是唯一对我有意义的案例:
def build_l1():
for n in xrange(1, 6):
yield n
def build_l2:
for n in xrange(2, 7):
yield n
l1 = build_l1()
l2 = build_l2()
iz = izip(l1, l2)
没有数组被加载到内存中。因此我们在 O(1) 内存中。
Python 中迭代器函数的内存使用是如何工作的?前两种情况似乎使用O(min(l1, l2)) 内存。我认为迭代器的主要目的是节省内存,这使得前两种情况看起来毫无用处。
【问题讨论】:
-
如果你遍历一个列表,它不会节省内存。关键是,您通常可以避免首先创建该列表。此外,当您可以渐近地保存内存时,节省内存不仅有意义。
-
你的
build_l1和build_l2没有多大意义,xrange已经存储了(from, to, step)