Давайте создадим простой массив из 10 миллионов bools со всеми значениями, инициализированными в True
n=10000000
sample = np.ones(n, dtype=bool)
Далее мы установим несколько значений в False
sample[1] = sample[5] = sample[12] = sample[25] = sample[50] = False
Число Trueзначения теперь n-5 = 9999995
Мы можем посчитать количество истинных значений, либо просматривая массив, либо используя np.nonzero
Первый метод занимает около 30 секунд на моем MacBookкак видно из
!date
sum=0
for i in range(n):
if sample[i] == True:
sum=sum+1
print(sum)
!date
Thu Dec 20 01:31:34 EST 2018
9999995
Thu Dec 20 01:32:02 EST 2018
В то время как второй метод занимает меньше секунды
!date
print(len(np.zero(sample)[0]))
!date
Thu Dec 20 01:33:05 EST 2018
9999995
Thu Dec 20 01:33:05 EST 2018
Когда массив равен 1 миллиарду бул, снова меньше секунды, тогда как цикл занимает околополчаса.
Почему такая огромная разница?Поддерживает ли метод numpy.nonzero какие-либо метаданные, к которым имеет доступ len? *