Я бы предпочел второй, так как он перебирает список только один раз.
Если вы используете count()
, вы перебираете список один раз, чтобы получить значения b
, а затем снова зацикливаете его, чтобы увидеть, сколько из них равно 1.
Аккуратный способ может использовать reduce()
:
reduce(lambda x,y: x + (1 if y.b == 1 else 0),list,0)
Документация говорит нам, что reduce()
будет:
Применить функцию два аргумента в совокупности с элементами итерируемого слева направо, чтобы свести итерируемое к одному значению.
Таким образом, мы определяем lambda
, который добавляет одно накопленное значение, только если атрибут элемента списка b
равен 1.
Итак, у вас есть автономная (вы сказали «предзагрузочная») программа, например, загрузчик, работающая в реальном режиме? И это на PeeCee с обычным BIOS?
В этом случае у вас работает только один процессор. Для раскрутки других модулей ЦП операционная система обычно выполняет так называемый универсальный алгоритм запуска , который выглядит следующим образом:
BSP sends AP an INIT IPI
BSP DELAYs (10mSec)
If (APIC_VERSION is not an 82489DX) {
BSP sends AP a STARTUP IPI
BSP DELAYs (200μSEC)
BSP sends AP a STARTUP IPI
BSP DELAYs (200μSEC)
}
BSP verifies synchronization with executing AP
BSP - это загрузочный процессор. AP - это процессор приложений. IPI - это межпроцессорное прерывание. Чтобы выполнить IPI, вам необходимо включить APIC, расширение контроллера прерываний для архитектуры ПК, которое не включается при загрузке. Вот почему код беспокоится о том, какая версия ICU запущена. Все это довольно глубокая магия ядра. Вы можете попробовать посмотреть Linux, NetBSD, или другой исходный код * BSD для примера, но его будет нелегко прочитать. Если вы действительно выиграете, вы можете найти где-нибудь небольшое ядро или отдельную программу тестирования SMP.
Для получения дополнительной информации см. Спецификацию мультипроцессоров Intel .