Проверка наличия двух значений в массиве
Для проверки наличия только двух значений в массиве я бы порекомендовал простой алгоритм перебора.
Код
import numba as nb
import numpy as np
@nb.njit(fastmath=True)
def isin(b):
for i in range(b.shape[0]):
res=False
if (b[i]==-1):
res=True
if (b[i]==1):
res=True
return res
#Parallelized call to isin if the data is an array of shape (n,m)
@nb.njit(fastmath=True,parallel=True)
def isin_arr(b):
res=np.empty(b.shape[0],dtype=nb.boolean)
for i in nb.prange(b.shape[0]):
res[i]=isin(b[i,:])
return res
Производительность
#Create some data (320MB)
A=(np.random.randn(10000000,32)-0.5)*5
A=A.astype(np.int8)
res=isin_arr(A) 11ms per call
Таким образом, с помощью этого метода я получаю пропускную способность около 29 ГБ / с, что недалеко от полосы пропускания памяти.Вы также можете попытаться уменьшить размер тестовых данных, чтобы они помещались в кэш-памяти L3, чтобы избежать ограничения полосы пропускания памяти.С 3,2 МБ тестовых данных я получаю throuput 100 ГБ / с (намного выше моей пропускной способности памяти), что является четким показателем того, что эта реализация ограничена пропускной способностью памяти.