itertools.ifilter与 过滤器 列表理解

ins*_*get 25 python module function built-in

我试图更熟悉itertools模块,并找到了一个名为的函数ifilter.

根据我的理解,它基于给定的函数进行过滤和迭代,并在包含函数计算结果的iterable元素的列表上返回一个迭代器True.

问题1:到目前为止我的理解是否正确?

问题2:除了返回和迭代器之外,它与内置filter函数有什么不同?

问题3哪个更快?

据我所知,事实并非如此.我错过了什么吗?(我跑了下面的测试)

>>> 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]
Run Code Online (Sandbox Code Playgroud)

Rik*_*ggi 19

你的理解是正确的:唯一的区别是ifilter返回一个迭代器,而使用filter就像调用:

list(ifilter(...))
Run Code Online (Sandbox Code Playgroud)

您可能也对PEP 289关于过滤器和ifilter的说法感兴趣:

列表理解大大减少了对filter()和的需求map().同样,生成器表达式可以最大限度地减少对itertools.ifilter()和的需求itertools.imap().[...]

还要注意,ifilter成为filter在Python-3(因此从itertools删除).


tob*_*ych 16

下面的示例包括一个数字生成器,它在产生数字之前立即打印消息,显示filter()首先构建列表的方式,然后运行并过滤它.尽管itertools.ifilter过滤器,但从不建立列表.如果您要过滤500,000个重要事项ifilter,那么您就不需要构建列表.

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
Run Code Online (Sandbox Code Playgroud)

输出:

itertools.ifilter:
yield 0
yield 1
1
yield 2
2
stopping

filter:
yield 0
yield 1
yield 2
stopping
1
2


Dor*_*mer 5

ifilter返回一个生成器,而不是一个列表。

生成器在需要时动态创建其项目,而不是首先分配整个列表。ifilter这是和之间的唯一区别filter