Itertools.ifilter Vs. Filter Vs. List Comprehensions
Solution 1:
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()
andmap()
. Likewise, generator expressions are expected to minimize the need foritertools.ifilter()
anditertools.imap()
. [...]
Also note that ifilter
became filter
in Python-3 (hence removed from itertools).
Solution 2:
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
defnumber_generator():
for i inrange(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 infilter(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
Solution 3:
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
Solution 4:
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.
Post a Comment for "Itertools.ifilter Vs. Filter Vs. List Comprehensions"