[Numpy-discussion] einsum slow vs (tensor)dot

George Nurser gnurser at gmail.com
Wed Oct 24 07:18:17 EDT 2012


I was just looking at the einsum function.
To me, it's a really elegant and clear way of doing array operations, which
is the core of what numpy is about.
It removes the need to remember a range of functions, some of which I find
tricky (e.g. tile).

Unfortunately the present implementation seems ~ 4-6x slower than dot or
tensordot for decent size arrays.
I suspect it is because the implementation does not use blas/lapack calls.

cheers, George Nurser.

E.g. (in ipython on Mac OS X 10.6, python 2.7.3, numpy 1.6.2 from macports)
a = np.arange(600000.).reshape(1500,400)
b = np.arange(240000.).reshape(400,600)
c = np.arange(600)
d = np.arange(400)

%timeit np.einsum('ij,jk', a, b)

10 loops, best of 3: 156 ms per loop

%timeit np.dot(a,b)
10 loops, best of 3: 27.4 ms per loop

%timeit np.einsum('i,ij,j',d,b,c)

1000 loops, best of 3: 709 us per loop

%timeit np.dot(d,np.dot(b,c))

10000 loops, best of 3: 121 us per loop


abig = np.arange(4800.).reshape(6,8,100)
bbig = np.arange(1920.).reshape(8,6,40)

%timeit np.einsum('ijk,jil->kl', abig, bbig)

1000 loops, best of 3: 425 us per loop

%timeit np.tensordot(abig,bbig, axes=([1,0],[0,1]))

10000 loops, best of 3: 105 us per loop
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/numpy-discussion/attachments/20121024/f47dc286/attachment.html>

More information about the NumPy-Discussion mailing list