itertools.ifilter Vs. filter Vs. list comprehensions

陌路散爱 提交于 2019-11-30 08:03:07
tobych

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

Your understanding is corret: the only difference is that ifilter returns an iterator, while using filter is like calling:

list(ifilter(...))

You may also be interested in what PEP 289 says about filter and ifilter:

List comprehensions greatly reduced the need for filter() and map(). Likewise, generator expressions are expected to minimize the need for itertools.ifilter() and itertools.imap(). [...]

Also note that ifilter became filter in Python-3 (hence removed from itertools).

Dor Shemer

ifilter returns a generator, not a list.

Generators create their items on the fly when needed, instead of allocating the entire list first. That's the only difference between ifilter and filter

Here, you can see the diference:

filter(function, iterable): Construct a list from those elements of iterable for which function returns true.

itertools.ifilter(predicate, iterable): Make an iterator that filters elements from iterable returning only those for which the predicate is True.

This means that to obtain 'ifiltered' items you should iterate with returned iterator, but 'filter' returns all elements in a list with out iteration needed.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!