Вот еще один метод, который использует тот факт, что массив содержит только нули и единицы.
Скалярное произведение двух векторов x и y является суммой (x (i) * y (i)), единственная ситуация, дающая ненулевой результат, если x (i) == y (i) == 1, используя например, numpy
from numpy import *
x = array([0,0,0,1,0,1])
y = array([0,0,1,1,1,1])
print dot(x,y)
просто и красиво. Этот метод делает n умножений и добавляет n-1 раз, однако существуют быстрые реализации, использующие SSE, GPGPU, векторизацию, (добавьте здесь свое причудливое слово) для точечных продуктов (скалярных продуктов)
Я сравнил метод numpy с этим методом:
sum(1 for a,b in zip(x,y) if (a==b==1))
и обнаружил, что для 1000000 циклов numpy-версия сделала это за 2121 мс, а zip-метод сделал это за 9502 мс, таким образом, numpy-версия намного быстрее
Я сделал лучший анализ эффективности и обнаружил, что
для n элементов в массиве метод zip занял t1 мс, а скалярное произведение заняло t2 мс за одно изменение
elements zip dot
1 0.0030 0.0207
10 0.0063 0.0230
100 0.0393 0.0476
1000 0.3696 0.2932
10000 7.6144 2.7781
100000 115.8824 30.1305
Из этих данных можно сделать вывод, что если ожидается, что число элементов в массиве (в среднем) будет больше 350 (или, скажем, 1000), следует вместо этого использовать метод точечного произведения.