Странно, сколько красоты у разных людей. Я считаю, что понимание списка намного яснее, чем filter
+ lambda
, но используйте то, что вам проще. Однако, перестаньте давать имена переменных, которые уже используются для встроенных модулей, это сбивает с толку. [ Вопрос изначально использовал list
в качестве имени переменной, но был обновлен в ответ на этот ответ. ]
Есть две вещи, которые могут замедлить ваше использование filter
.
Во-первых, это издержки вызова функции: как только вы используете функцию Python (независимо от того, создана ли она def
или lambda
), вполне вероятно, что фильтр будет медленнее, чем понимание списка. Это почти наверняка недостаточно для того, чтобы иметь значение, и вы не должны много думать о производительности, пока не рассчитаете свой код и не обнаружите, что это узкое место, но разница будет.
Другие накладные расходы, которые могут возникнуть, это то, что лямбда вынуждена обращаться к переменной области (value
). Это медленнее, чем доступ к локальной переменной, а в Python 2.x понимание списка доступно только для локальных переменных. Если вы используете Python 3.x, понимание списка выполняется в отдельной функции, поэтому он также будет обращаться к value
через замыкание, и это различие не будет применяться.
Другой вариант, который следует рассмотреть, - использовать генератор вместо понимания списка:
def filterbyvalue(seq, value):
for el in seq:
if el.attribute==value: yield el
Затем в вашем основном коде (где действительно важна читабельность) вы заменили как понимание списка, так и фильтр на многообещающее имя функции.