{ "metadata": { "name": "", "signature": "sha256:6543fc225dae92af493c02b7a2a229c61627cd0c893a1b1cd02138de294398db" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "code", "collapsed": false, "input": [ "n=1000\n", "mat=np.random.rand(n,n)\n", "\n", "n2=100\n", "mat2=np.random.rand(n2,n2)\n", "\n", "n3=10\n", "mat3=np.random.rand(n3,n3)" ], "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": [ "(1000, 1000)" ] } ], "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: 19min 22s per loop\n" ] } ], "prompt_number": 4 }, { "cell_type": "code", "collapsed": false, "input": [ "%timeit -r 3 -n 1 matmul(mat2,mat2)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1 loops, best of 3: 1.15 s per loop\n" ] } ], "prompt_number": 5 }, { "cell_type": "code", "collapsed": false, "input": [ "%timeit -r 3 -n 1 matmul(mat3,mat3)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1 loops, best of 3: 1.48 ms per loop\n" ] } ], "prompt_number": 6 }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 6 }, { "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: 48 ms per loop\n" ] } ], "prompt_number": 7 }, { "cell_type": "code", "collapsed": false, "input": [ "%timeit -r 3 -n 1 matmul_dot(mat2,mat2)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1 loops, best of 3: 61 \u00b5s per loop\n" ] } ], "prompt_number": 8 }, { "cell_type": "code", "collapsed": false, "input": [ "%timeit -r 3 -n 1 matmul_dot(mat3,mat3)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1 loops, best of 3: 1.91 \u00b5s per loop\n" ] } ], "prompt_number": 9 }, { "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": 10 }, { "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: 3.79 s per loop\n" ] } ], "prompt_number": 11 }, { "cell_type": "code", "collapsed": false, "input": [ "%timeit -r 3 -n 1 matmul_nb(mat2,mat2)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1 loops, best of 3: 2.83 ms per loop\n" ] } ], "prompt_number": 12 }, { "cell_type": "code", "collapsed": false, "input": [ "%timeit -r 3 -n 1 matmul_nb(mat3,mat3)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1 loops, best of 3: 5.96 \u00b5s per loop\n" ] } ], "prompt_number": 13 }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Cython" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%load_ext cythonmagic" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 14 }, { "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": 15 }, { "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: 3.41 s per loop\n" ] } ], "prompt_number": 16 }, { "cell_type": "code", "collapsed": false, "input": [ "%timeit -r 3 -n 1 matmul_cy(mat2,mat2)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1 loops, best of 3: 2.69 ms per loop\n" ] } ], "prompt_number": 17 }, { "cell_type": "code", "collapsed": false, "input": [ "%timeit -r 3 -n 1 matmul_cy(mat3,mat3)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1 loops, best of 3: 5.01 \u00b5s per loop\n" ] } ], "prompt_number": 18 }, { "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": 19 }, { "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": 20 }, { "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": 21 }, { "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: 1.3 s per loop\n" ] } ], "prompt_number": 22 }, { "cell_type": "code", "collapsed": false, "input": [ "%timeit -r 3 -n 1 matmul_fortran.matmul_s(mat2,mat2)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1 loops, best of 3: 770 \u00b5s per loop\n" ] } ], "prompt_number": 23 }, { "cell_type": "code", "collapsed": false, "input": [ "%timeit -r 3 -n 1 matmul_fortran.matmul_s(mat3,mat3)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1 loops, best of 3: 5.01 \u00b5s per loop\n" ] } ], "prompt_number": 24 }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 25 }, { "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: 609 ms per loop\n" ] } ], "prompt_number": 26 }, { "cell_type": "code", "collapsed": false, "input": [ "%timeit -r 3 -n 1 matmul_fortran.matmul_fi(mat2,mat2)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1 loops, best of 3: 700 \u00b5s per loop\n" ] } ], "prompt_number": 27 }, { "cell_type": "code", "collapsed": false, "input": [ "%timeit -r 3 -n 1 matmul_fortran.matmul_fi(mat3,mat3)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1 loops, best of 3: 4.05 \u00b5s per loop\n" ] } ], "prompt_number": 28 }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 28 } ], "metadata": {} } ] }