Я пытался найти самый быстрый способ подсчета количества элементов в списке, соответствующих определенному фильтру.
В этом случае выясняем, сколько нечетных чисел в списке.
При этом я был удивлен результатами сравнения понимания списка с эквивалентным выражением генератора:
python -m timeit -s "L = xrange(1000000)" "sum([1 for i in L if i & 1])"
10 loops, best of 3: 109 msec per loop
python -m timeit -s "L = xrange(1000000)" "sum(1 for i in L if i & 1)"
10 loops, best of 3: 125 msec per loop
Я также пытался с L быть обычным списком и разных размеров, но во всех случаях понимание списка побеждает.
Что делает genexp, который заставляет его работать медленнее, чем listcomp, который создает новый список с 1 миллионом элементов ...?
(Кстати, самый быстрый способ, который я нашел, был: x = 1; len(filter(x.__and__, L))
. И да, я знаю, что написание такого кода убивает котят, я делаю это ради удовольствия)