Я пытался найти самый быстрый способ подсчета количества элементов в списке, соответствующем определенному фильтру. В этом случае, найдя количество нечетных чисел в списке.Почему этот генкс хуже, чем понимание списка?
При этом, я был удивлен результатами сравнения список понимание против эквивалентного выражения генератора:
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 быть обычный список, и разных размеров, но и во всех случаев выигрывает список.
Что такое генкс, что делает его медленнее по сравнению с listcomp, который создает новый список с 1 миллионом элементов ...?
(Кстати, самый быстрый способ я нашел: x = 1; len(filter(x.__and__, L))
И да, я знаю, писать код, как убивает котенок, я делаю это для удовольствия.)
1+. Также можно отметить, что во многих случаях генераторы могут использовать меньше памяти из-за своего потока, подобного природе. Рассмотрите возможность чтения каждой строки в файле в списке и сравните ее, прочитав каждую строку, работая с ней и отбросив ее. – Skurmedel