numpy 的 dot 和 einsum 都比较慢,你可以考虑用 numba 的 guvectorize
@
guvectorize([(float64[:], float64[:], float64[:])],
'(n),(n)->()', target='parallel')
def my_inner_prod(a, b, ret):
tmp1 = tmp2 = tmp3 = 0
for i in range(a.shape[0]):
tmp1 += a[i] * b[i]
tmp2 += a[i] * a[i]
tmp3 += b[i] * b[i]
ret[0] = tmp1 / (tmp2 * tmp3) ** 0.5
这个是 cos(theta),如果不除以模量则只要 tmp1 就可以了
可以快很多。只要向量维度是对齐的,比如 (100000,250) . (100000,250) -> (100000,)
或者(100000,250) . (1,250) -> (100000,)
降维是不是可以考虑 PCA?