{ "metadata": { "name": "", "signature": "sha256:c3a802f3d9358b3877e4556b6a1145c0ceec9752507b1a6cd5a7fb5ebbe09146" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "code", "collapsed": false, "input": [ "n=500\n", "mat=np.random.rand(n,n)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "code", "collapsed": false, "input": [ "mat.shape" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 2, "text": [ "(500, 500)" ] } ], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Python, Numpy" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def matmul(mat1,mat2):\n", " out=np.zeros((mat1.shape[0],mat2.shape[1]))\n", " for i in xrange(mat1.shape[0]):\n", " for j in xrange(mat2.shape[1]):\n", " for k in xrange(mat1.shape[1]):\n", " out[i,j]+=mat1[i,k]*mat2[k,j]\n", " return out\n", "\n", "def matmul_dot(mat1,mat2):\n", " return np.dot(mat1,mat2)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 3 }, { "cell_type": "code", "collapsed": false, "input": [ "%timeit -r 3 -n 1 matmul(mat,mat)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1 loops, best of 3: 2min 19s per loop\n" ] } ], "prompt_number": 4 }, { "cell_type": "code", "collapsed": false, "input": [ "%timeit -r 3 -n 1 matmul_dot(mat,mat)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1 loops, best of 3: 6.17 ms per loop\n" ] } ], "prompt_number": 6 }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Numba" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import numba\n", "\n", "matmul_nb=numba.autojit(matmul)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 7 }, { "cell_type": "code", "collapsed": false, "input": [ "%timeit -r 3 -n 1 matmul_nb(mat,mat)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1 loops, best of 3: 329 ms per loop\n" ] } ], "prompt_number": 8 }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Cython" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%load_ext cythonmagic" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 10 }, { "cell_type": "code", "collapsed": false, "input": [ "%%cython\n", "import cython\n", "import numpy as np\n", "cimport numpy as np\n", "@cython.boundscheck(False)\n", "@cython.wraparound(False)\n", "@cython.nonecheck(False)\n", "def matmul_cy(np.ndarray[double,ndim=2] mat1,np.ndarray[double,ndim=2] mat2):\n", " cdef np.ndarray[double,ndim=2] out=np.zeros((mat1.shape[0],mat2.shape[1]))\n", " cdef int i,j,k\n", " for i in xrange(mat1.shape[0]):\n", " for j in xrange(mat2.shape[1]):\n", " for k in xrange(mat1.shape[1]):\n", " out[i,j]+=mat1[i,k]*mat2[k,j]\n", " return out" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 11 }, { "cell_type": "code", "collapsed": false, "input": [ "%timeit -r 3 -n 1 matmul_cy(mat,mat)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1 loops, best of 3: 334 ms per loop\n" ] } ], "prompt_number": 12 }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Fortran" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%%file matmul.f90\n", "subroutine matmul_s(n1,n2,n3,mat1,mat2,mat3)\n", "implicit none\n", "integer,intent(in):: n1,n2,n3\n", "real(kind=8),intent(in):: mat1(n1,n2),mat2(n2,n3)\n", "real(kind=8),intent(out):: mat3(n1,n3)\n", "integer i,j,k\n", "do i=1,n1\n", "do j=1,n3\n", " mat3(i,j)=0.\n", " do k=1,n2\n", " mat3(i,j)=mat3(i,j)+mat1(i,k)*mat2(k,j)\n", " enddo\n", "enddo\n", "enddo\n", "end subroutine\n", "\n", "subroutine matmul_fi(n1,n2,n3,mat1,mat2,mat3)\n", "implicit none\n", "integer,intent(in):: n1,n2,n3\n", "real(kind=8),intent(in):: mat1(n1,n2),mat2(n2,n3)\n", "real(kind=8),intent(out):: mat3(n1,n3)\n", "mat3=matmul(mat1,mat2)\n", "end subroutine" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Overwriting matmul.f90\n" ] } ], "prompt_number": 14 }, { "cell_type": "code", "collapsed": false, "input": [ "!f2py -c -m matmul_fortran matmul.f90 --f90exec=/opt/local/bin/gfortran-mp-4.9 > log.txt" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 15 }, { "cell_type": "code", "collapsed": false, "input": [ "import matmul_fortran\n", "print matmul_fortran.__doc__" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "This module 'matmul_fortran' is auto-generated with f2py (version:2).\n", "Functions:\n", " mat3 = matmul_s(mat1,mat2,n1=shape(mat1,0),n2=shape(mat1,1),n3=shape(mat2,1))\n", " mat3 = matmul_f(mat1,mat2,n1=shape(mat1,0),n2=shape(mat1,1),n3=shape(mat2,1))\n", " mat3 = matmul_fi(mat1,mat2,n1=shape(mat1,0),n2=shape(mat1,1),n3=shape(mat2,1))\n", ".\n" ] } ], "prompt_number": 16 }, { "cell_type": "code", "collapsed": false, "input": [ "%timeit -r 3 -n 1 matmul_fortran.matmul_s(mat,mat)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1 loops, best of 3: 108 ms per loop\n" ] } ], "prompt_number": 17 }, { "cell_type": "code", "collapsed": false, "input": [ "%timeit -r 3 -n 1 matmul_fortran.matmul_fi(mat,mat)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1 loops, best of 3: 70.7 ms per loop\n" ] } ], "prompt_number": 19 }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 21 } ], "metadata": {} } ] }