itertools.ifilter VS.过滤器VS.列表解析 [英] itertools.ifilter Vs. filter Vs. list comprehensions
问题描述
我试图更熟悉 itertools
模块,并找到了一个名为 ifilter
的函数。
据我所知,它基于给定的函数过滤和迭代,并在包含函数计算结果的迭代元素的列表上返回一个迭代器真
。
问题1 :我的理解到目前为止是否正确?
问题2 :除了这个返回和迭代器的事实,它与内置的过滤器
函数有什么不同?
问题3 哪个更快?
从我所知道的情况来看,事实并非如此。我错过了什么吗? (我跑了下面的测试)
>>> itertools.ifilter(lambda x:x%2,range(5))
< itertools.ifilter对象在0x7fb1a101b210>
>>>对于我在itertools.ifilter(lambda x:x%2,range(5))中:print i
...
1
3
>>>过滤器(lambda x:x%2,范围(5))
[1,3]
>>> function = lambda x:x%2
>>> [item for item in range(5)if function(item)]
[1,3]
下面的示例包含一个数字生成器,它在产生数字之前立即打印消息,显示 filter()
第一次建立列表,然后运行并过滤它。尽管 itertools.ifilter
过滤器,但从不建立列表。如果你过滤了500,000个重要的东西,你需要 ifilter
,所以你不建立一个列表。
import itertools
def number_generator():
在范围内(0,3):
printyield,i
产量i
打印停止
函数= lambda x:x> 0
数字= number_generator()
打印itertools.ifilter:在itertools.ifilter(函数,数字)中输入n
:
print n
打印\\\
filter:
numbers = number_generator()
for filter in filter(function,numbers):
print n
$ c $输出:
itertools.ifilter:$ b输出:
$ $ b收益率0
收益率1
1
收益率2
2
止损
过滤器:
收益率0
产量1
产量2
停产
1
2
I am trying to become more familiar with the
itertools
module and have found a function calledifilter
.From what I understand, it filters and iterable based on the given function and returns an iterator over a list containing the elements of the iterable on which the function evaluates to
True
.Question 1: is my understanding thus far correct?
Question 2: aside from the fact that this returns and iterator, how is it different from the built-in
filter
function?Question 3 Which is faster?
From what I can tell, it is not. Am I missing something? (I ran the following test)
>>> itertools.ifilter(lambda x: x%2, range(5)) <itertools.ifilter object at 0x7fb1a101b210> >>> for i in itertools.ifilter(lambda x: x%2, range(5)): print i ... 1 3 >>> filter(lambda x: x%2, range(5)) [1, 3] >>> function = lambda x: x%2 >>> [item for item in range(5) if function(item)] [1,3]
解决方案The example below includes a number generator that prints a message immediately before yielding the number, shows up how
filter()
first builds the list, then runs through that and filters it. Whereasitertools.ifilter
filters as it goes, never building a list. If you're filtering 500,000 significant things, you wantifilter
, so you're not building a list.import itertools def number_generator(): for i in range(0, 3): print "yield", i yield i print "stopping" function = lambda x: x > 0 numbers = number_generator() print "itertools.ifilter:" for n in itertools.ifilter(function, numbers): print n print "\nfilter:" numbers = number_generator() for n in filter(function, numbers): print n
Output:
itertools.ifilter: yield 0 yield 1 1 yield 2 2 stopping filter: yield 0 yield 1 yield 2 stopping 1 2
这篇关于itertools.ifilter VS.过滤器VS.列表解析的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!