itertools.ifilter VS.过滤器VS.列表解析 [英] itertools.ifilter Vs. filter Vs. list comprehensions

查看:177
本文介绍了itertools.ifilter VS.过滤器VS.列表解析的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图更熟悉 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
 
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 called ifilter.

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. Whereas itertools.ifilter filters as it goes, never building a list. If you're filtering 500,000 significant things, you want ifilter, 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆