Itertools.ifilter Vs. фильтр Vs. список понятий
Я пытаюсь ознакомиться с модулем itertools
и нашел функцию под названием ifilter
.
Из того, что я понимаю, он фильтрует и повторяется на основе данной функции и возвращает итератор по списку, содержащему элементы итерабельного, по которому функция оценивает 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]
Ответы
Ответ 1
В приведенном ниже примере содержится генератор чисел, который печатает сообщение непосредственно перед присвоением номера, показывает, как 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
Вывод:
itertools.ifilter:
yield 0
yield 1
1
yield 2
2
stopping
filter:
yield 0
yield 1
yield 2
stopping
1
2
Ответ 2
Ваше понимание - это corret: единственное отличие состоит в том, что ifilter
возвращает итератор, а использование filter
- это вызов:
list(ifilter(...))
Вы также можете быть заинтересованы в том, что PEP 289 говорит о фильтре и ifilter:
Значения списков значительно уменьшили необходимость filter()
и map()
. Аналогично, ожидается, что выражения генератора минимизируют потребность в itertools.ifilter()
и itertools.imap()
. [...]
Также обратите внимание, что ifilter
стал filter
в Python-3 (следовательно, удален из itertools).
Ответ 3
ifilter
возвращает генератор, а не список.
Генераторы создают свои элементы "на лету", когда это необходимо, вместо того, чтобы сначала распределять весь список. Единственное различие между ifilter
и filter
Ответ 4
Здесь вы можете увидеть разницу:
filter (function, iterable): Создайте список из тех элементов итерации, для которых функция возвращает true.
itertools.ifilter(предикат, итерируемый): Сделать iterator, который фильтрует элементы из итеративного, возвращающего только те, для которых предикат имеет значение Истина.
Это означает, что для получения элементов "ifiltered" вы должны выполнять итерацию с возвращенным итератором, но "фильтр" возвращает все элементы в списке с нужной итерацией.