我正在阅读e-satis的答案,“ yield”关键字在Python中有什么作用?。他说:
这些可迭代的方法很方便,因为您可以随意读取它们,但是您将所有值存储在内存中,当值很多时,这并不总是想要的
我真的不同意。但是我不能在那发表评论。
然后是这个问题:Python的可迭代对象是否真的将所有值存储在内存中?
我曾经这样认为。但是自从昨天看到Python的详细文档以来,我改变了看法。
>>> import sys
>>> def gen():
... n = 0
... while n < 10:
... yield n
... n += 1
...
>>> a = [0,1,2,3,4,5,6,7,8,9]
>>> b = range(10) # b is a range object, which is a iterable
>>> c = gen(10) # c is a iterator, which is a iterable too
>>> sys.getsizeof(a)
144
>>> sys.getsizeof(b)
48
>>> sys.getsizeof(c)
72
>>> B = list(b)
>>> C = list(c)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> B
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> C
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> sys.getsizeof(B)
200
>>> sys.getsizeof(C)
160
我们错误地认为Iterable将所有值存储在内存中,因为在使用Iterable时我们习惯于获取所有值。
我对吗?
引用该答案时,您剥离了太多上下文。它是在诸如列表之类的可迭代对象的上下文中专门制作的。生成器和yield
关键字在答案的后面分别介绍。
扩大报价:
您可以在“ for ... in ...”上使用的所有内容都是可迭代的;列表,字符串,文件...
这些可迭代的方法很方便,因为您可以根据需要读取它们,但是您将所有值存储在内存中,当拥有很多值时,这并不总是想要的。
该声明对于列表和字符串是正确的,它们存储在内存中。但是,这对于文件来说是不正确的,因为您可以遍历文件而不将其全部存储在内存中。
可迭代的python可能会或可能不会将值存储在内存中。它一次浏览一个值,并且每一步都可以从内存中拉出该值,从头开始创建它,或者从另一个来源(例如文件)中读取它。
range()
一个很好的例子:在Python 2.x中,它会预先生成所有值并将其存储在内存中;在Python 3.x中,它会根据需要生成它们。两者都返回一个可迭代的对象。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句