[SciPy-User] How to efficiently do dot(dot( A.T, diag(d) ), A ) ?

Pauli Virtanen pav at iki.fi
Tue Sep 11 13:15:27 EDT 2012


Hi,

First a quick note: Please, when posting any benchmark result, always
include the full test code for each case.

11.09.2012 05:43, Hugh Perkins kirjoitti:
>> It's not so clear what kind of improvements you are looking for. Do you
>> perhaps expect that there exist some magic to ignore half of the
>> computations with dot product, when the result is symmetric?
> 
> Here's the same test in matlab:
[clip]

You are here bencmarking the underlying BLAS libraries. Matlab comes
with Intel MKL, whereas your Numpy/Scipy is likely linked with ATLAS.

MKL can be faster than ATLAS, but on the other hand you can also link
the Numpy/Scipy combination against MKL (provided you buy a license from
Intel).

In your Matlab example, the first matrix product is a sparse-dense one,
whereas the second is dense-dense (MKL-fast). That the speeds of the two
operations happen to coincide is likely a coincidence.

In the Numpy case without sparse matrices, the first product is
broadcast-multiplication (faster than a sparse-dense matrix product),
whereas the second product is a dense-dense matrix multiplication.


Here are results on one (slowish) machine:
----
import numpy as np
n = 10000
k = 100
a = np.random.rand(n)
c = np.random.rand(k,n)
d = c*a
e = np.dot(d, c.T)
%timeit d = c*a
# -> 100 loops, best of 3: 11 ms per loop
%timeit e = np.dot(d, c.T)
# -> 10 loops, best of 3: 538 ms per loop
----
n = 10000;
k = 100;
a = spdiags(rand(n,1),0,n,n);
c = rand(k,n);
tic, d = c*a; toc
% -> Elapsed time is 0.018380 seconds.
tic, e = d*c'; toc
% -> Elapsed time is 0.138673 seconds.

-- 
Pauli Virtanen




More information about the SciPy-User mailing list