In [1]:
n=1000
mat=np.random.rand(n,n)
n2=100
mat2=np.random.rand(n2,n2)
n3=10
mat3=np.random.rand(n3,n3)
In [2]:
mat.shape
Out[2]:
In [3]:
def matmul(mat1,mat2):
out=np.zeros((mat1.shape[0],mat2.shape[1]))
for i in xrange(mat1.shape[0]):
for j in xrange(mat2.shape[1]):
for k in xrange(mat1.shape[1]):
out[i,j]+=mat1[i,k]*mat2[k,j]
return out
def matmul_dot(mat1,mat2):
return np.dot(mat1,mat2)
In [4]:
%timeit -r 3 -n 1 matmul(mat,mat)
In [5]:
%timeit -r 3 -n 1 matmul(mat2,mat2)
In [6]:
%timeit -r 3 -n 1 matmul(mat3,mat3)
In [6]:
In [7]:
%timeit -r 3 -n 1 matmul_dot(mat,mat)
In [8]:
%timeit -r 3 -n 1 matmul_dot(mat2,mat2)
In [9]:
%timeit -r 3 -n 1 matmul_dot(mat3,mat3)
In [10]:
import numba
matmul_nb=numba.autojit(matmul)
In [11]:
%timeit -r 3 -n 1 matmul_nb(mat,mat)
In [12]:
%timeit -r 3 -n 1 matmul_nb(mat2,mat2)
In [13]:
%timeit -r 3 -n 1 matmul_nb(mat3,mat3)
In [14]:
%load_ext cythonmagic
In [15]:
%%cython
import cython
import numpy as np
cimport numpy as np
@cython.boundscheck(False)
@cython.wraparound(False)
@cython.nonecheck(False)
def matmul_cy(np.ndarray[double,ndim=2] mat1,np.ndarray[double,ndim=2] mat2):
cdef np.ndarray[double,ndim=2] out=np.zeros((mat1.shape[0],mat2.shape[1]))
cdef int i,j,k
for i in xrange(mat1.shape[0]):
for j in xrange(mat2.shape[1]):
for k in xrange(mat1.shape[1]):
out[i,j]+=mat1[i,k]*mat2[k,j]
return out
In [16]:
%timeit -r 3 -n 1 matmul_cy(mat,mat)
In [17]:
%timeit -r 3 -n 1 matmul_cy(mat2,mat2)
In [18]:
%timeit -r 3 -n 1 matmul_cy(mat3,mat3)
In [19]:
%%file matmul.f90
subroutine matmul_s(n1,n2,n3,mat1,mat2,mat3)
implicit none
integer,intent(in):: n1,n2,n3
real(kind=8),intent(in):: mat1(n1,n2),mat2(n2,n3)
real(kind=8),intent(out):: mat3(n1,n3)
integer i,j,k
do i=1,n1
do j=1,n3
mat3(i,j)=0.
do k=1,n2
mat3(i,j)=mat3(i,j)+mat1(i,k)*mat2(k,j)
enddo
enddo
enddo
end subroutine
subroutine matmul_fi(n1,n2,n3,mat1,mat2,mat3)
implicit none
integer,intent(in):: n1,n2,n3
real(kind=8),intent(in):: mat1(n1,n2),mat2(n2,n3)
real(kind=8),intent(out):: mat3(n1,n3)
mat3=matmul(mat1,mat2)
end subroutine
In [20]:
!f2py -c -m matmul_fortran matmul.f90 --f90exec=/opt/local/bin/gfortran-mp-4.9 > log.txt
In [21]:
import matmul_fortran
print matmul_fortran.__doc__
In [22]:
%timeit -r 3 -n 1 matmul_fortran.matmul_s(mat,mat)
In [23]:
%timeit -r 3 -n 1 matmul_fortran.matmul_s(mat2,mat2)
In [24]:
%timeit -r 3 -n 1 matmul_fortran.matmul_s(mat3,mat3)
In [25]:
In [26]:
%timeit -r 3 -n 1 matmul_fortran.matmul_fi(mat,mat)
In [27]:
%timeit -r 3 -n 1 matmul_fortran.matmul_fi(mat2,mat2)
In [28]:
%timeit -r 3 -n 1 matmul_fortran.matmul_fi(mat3,mat3)
In [28]: