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, доступность памяти для «ускорения» этого ускорения и т. Д. Могут, конечно, повлиять на точную производительность.
I think that setting data breakpoints is only available if you are debugging in native mode. It is not available in managed mode, or mixed mode debugging.