Новая Точка прерывания по данным отключила в Visual Studio 2008 смешанный проект

sum(x.b == 1 for x in L)

Логическое (как результат сравнений, таких как x.b == 1) также является int, со значением 0 для False, 1 для True, поэтому арифметика, такая как суммирование работает просто отлично.

Это самый простой код, но, возможно, не самый быстрый (наверняка вам скажет только timeit ;-). Рассмотрим (упрощенный случай, чтобы хорошо вписаться в командные строки, но эквивалентно):

$ py26 -mtimeit -s'L=[1,2,1,3,1]*100' 'len([x for x in L if x==1])'
10000 loops, best of 3: 56.6 usec per loop
$ py26 -mtimeit -s'L=[1,2,1,3,1]*100' 'sum(x==1 for x in L)'
10000 loops, best of 3: 87.7 usec per loop

Таким образом, для этого случая «расточительный в памяти» подход генерации дополнительного временного списка и проверки его длины на самом деле значительно быстрее чем более простой, короткий, бережливый к памяти, который я предпочитаю. Разумеется, другие комбинации значений списка, реализации Python, доступность памяти для «ускорения» этого ускорения и т. Д. Могут, конечно, повлиять на точную производительность.

7
задан Andy Dent 20 October 2009 в 08:03
поделиться