Фактор, который вы наблюдаете, является прямым следствием того факта, что c=numpy.array([[0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1],[0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1]])
является массивом на int
, а int
кодируется в 32 битах
, поэтому, когда вы переходите в c.all (), вывыполняем операцию на 37 * 32 = 1184 битах
Однако a = 0b0000000001111111111100000001111111111
состоит из 37 битов, поэтому при выполнении a&b
операция выполняется на 37 битах.
, поэтому вы делаетечто-то в 32 раза дороже с массивом numpy.
Давайте проверим, что
import timeit
import numpy as np
print("Time taken to perform bitwise & :",timeit.timeit('a=0b0000000001111111111100000001111111111; b = 0b0000000001111111111100000001111111111; c = a&b',number=320000))
a = 0b0000000001111111111100000001111111111
b = 0b0000000001111111111100000001111111111
c=np.array([a,b])
print("Time taken to perform 'numpy.all' : ",timeit.timeit(lambda :c.all(axis=0),number=10000))
операцию &
я выполняю 320000 раз, а операцию all()
- 10000 раз.
Time taken to perform bitwise & : 0.01527938833025152
Time taken to perform 'numpy.all' : 0.01583387375572265
Это то же самое!
Теперь вернемся к исходной проблеме, вы хотите знать индексы, где биты равны 1 в большом двоичном числе.
Возможно, вы могли бы попробоватьвещи, предоставляемые модулем bitarray
a = bitarray.bitarray('0000000001111111111100000001111111111')
b = bitarray.bitarray('0000000001111111111100000001111111111')
i=0
data = list()
for c in a&b:
if(c):
data.append(i)
i=i+1
print (data)
выходы
[9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]