【发布时间】:2015-12-03 10:24:49
【问题描述】:
我无法理解 yield 关键字。
我了解程序执行时会发生什么影响,但我并不真正了解它使用了多少内存。
我将尝试使用示例来解释我的疑问。
假设我们有三个函数:
HUGE_NUMBER = 9223372036854775807
def function1():
for i in range(0, HUGE_NUMBER):
yield i
def function2():
x = range(0, HUGE_NUMBER)
for i in x:
yield i
def function3(file):
with open(file, 'r') as f:
dictionary = dict(csv.reader(f, delimiter = ' '))
for k,v in dictionary.iteritems():
yield k,v
如果我遍历第一个函数返回的生成器,那么巨大的范围是否真的存储在内存中?
第二个函数呢?
如果我对第三个函数返回的生成器进行迭代(而不是只创建该字典并直接对其进行迭代),我的程序会使用更少的内存吗?
【问题讨论】:
-
我觉得我的标题不太好。如果有人对如何改进它有任何想法,请随时这样做。
-
是的,只要您第一次调用
next(),它就会存储在内存中。如果您使用的是 Python 2,请使用xrange(),否则在 Python 3 中就可以了。相关:stackoverflow.com/a/25457580/846892 -
哪个 Python 版本?
-
将
yield视为在函数产生后冻结函数的执行,直到从生成器中提取下一个值(通过调用next(gen)。因为此时您已经构建了巨大的范围并将其绑定到该函数范围内的x,您的内存已经消失,yield不会改变这一事实。使用像xrange()这样的惰性迭代器(或imap(),izip(),等)结合它但是会。 -
@user2864740:他们使用
dict.iteritems(),所以Python 2.x。
标签: python memory generator yield