python3 为什么要把 filter() 返回值改成迭代器对象?
好处在哪?
处理起来不是很麻烦,就是不明白 Python3 这样改的原因
python3 为什么要把 filter() 返回值改成迭代器对象?
好处在哪?
处理起来不是很麻烦,就是不明白 Python3 这样改的原因
因为本身map/filter处理的可迭代对象就可能就是一个生成器.
如果返回一个列表的话,会给他们带来很多限制
2.x里边,我没办法通过map和filter返回一个迭代器,只能一次性将数据全部读到内存,如果我读的是一个超大文件的行,就只能避免使用map和filter,因为内存会溢出
现在返回一个生成器,这种问题就避免了
同时,想转还成列表也并不麻烦,多加一步而已.
4 回答4.4k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
1 回答2.9k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
1 回答4.5k 阅读✓ 已解决
1 回答3.8k 阅读✓ 已解决
1 回答2.8k 阅读✓ 已解决
很简单的原因:memory saving。map和filter等函数返回一个迭代器,这个迭代器具有类生成器的特性。而我们知道生成器是懒加载的,它只有在下次调用的时候才会去计算本次生成的值,而不是像列表那样预先生成所有的值然后每次调用返回列表中的下一个值。这种方式需要将所有的值预先保存在列表中,当列表很大的时候这是非常消耗内存的。
可以考虑下这样的场景:有一个2GB大小的文本文档,其中有千万级的用户记录,现在要用filter从其中找出所有用户名以abc开头的记录并且将它们写到另外一个文本文档中。如果filter返回的不是迭代器而直接是所有符合的用户记录列表的话,保存这些用户信息消耗的内存将会是非常惊人的,也是不可接受的。正因为filter返回的是迭代器,我们才可以以非常小的内存代价逐条从这样一个文本文档中读取并处理用户记录。