Done right, sparse dot is faster - if the matrices are indeed sparse. But you can't just throw the arrays into the csr_matrix.dot function.
In [68]: N=1000
In [69]: from scipy import sparse
In [70]: A=np.eye(N) # the diagonal is more interesting than all zeros
In [71]: B=np.random.rand(N,N)
Base case - dense matrix product
In [72]: timeit np.dot(B,A)
10 loops, best of 3: 98.8 ms per loop
This time is the same for all arrays of the same size (e.g dot(B,B), dot(A,A)).
Make sparse matrix from both. As has lots of zeros, Bs has none, but it is in sparse format
In [73]: As=sparse.csr_matrix(A)
In [74]: Bs=sparse.csr_matrix(B)
Note the conversion times; they are not trivial
In [101]: timeit sparse.csr_matrix(A)
100 loops, best of 3: 13.8 ms per loop
In [102]: timeit sparse.csr_matrix(B)
10 loops, best of 3: 50.1 ms per loop
Matrix product with the csr matrices can be faster. I'll use the Bs.dot(As) form because it's clearer. Bs*As and np.dot(Bs,As) are equivalent. But don't try np.dot(Bs,A)
In [107]: timeit Bs.dot(As)
100 loops, best of 3: 19 ms per loop
In [112]: timeit sparse.csr_matrix(B).dot(sparse.csr_matrix(A)).A
10 loops, best of 3: 94.1 ms per loop
Noticeably better than the dense version, but marginally better if we include the conversion times.
But note that times vary widely depending on the sparsity of the matrices
In [108]: timeit As.dot(Bs)
100 loops, best of 3: 10 ms per loop
In [109]: timeit As.dot(B)
100 loops, best of 3: 5.82 ms per loop
In [110]: timeit As.dot(As)
1000 loops, best of 3: 215 µs per loop
In [111]: timeit Bs.dot(Bs)
1 loop, best of 3: 3.83 s per loop
%time csr_matrix(B).dot(A)does first a conversion ofBto acsr_matrix. Is that something you want to time as well? - jotasinp.dotis extremely efficient under normal scenarios. - Divakar