Подтвердить что ты не робот

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]
4b9b3361

Ответ 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" вы должны выполнять итерацию с возвращенным итератором, но "фильтр" возвращает все элементы в списке с нужной итерацией.