Vector: np.sum(np.triu(np.multiply.outer(arr1,arr2),1)) .
to improve 30 times:
In [9]: %timeit np.sum(np.triu(np.multiply.outer(arr1,arr2),1)) 1000 loops, best of 3: 272 µs per loop In [10]: %timeit np.sum( [arr1[i]*arr2[j] for i in range(n) for j in range(i+1, n)] 100 loops, best of 3: 7.9 ms per loop In [11]: allclose(np.sum(np.triu(np.multiply.outer(arr1,arr2),1)), np.sum(np.triu(np.multiply.outer(arr1,arr2),1))) Out[11]: True
Another quick way is to use numba:
from numba import jit @jit def t(arr1,arr2): s=0 for i in range(n): for j in range(i+1,n): s+= arr1[i]*arr2[j] return s
for a 10x new factor:
In [12]: %timeit t(arr1,arr2) 10000 loops, best of 3: 21.1 µs per loop
And using the minimum answer @ user2357112 answer,
@jit def t2357112(arr1,arr2): s=0 c=0 for i in range(n-2,-1,-1): c += arr2[i+1] s += arr1[i]*c return s
for
In [13]: %timeit t2357112(arr1,arr2) 100000 loops, best of 3: 2.33 µs per loop
just by performing the necessary operations.
BM
source share