{
 "metadata": {
  "name": "",
  "signature": "sha256:f0b357ccb1145b65472bae03ede5fc3ff7acfd6c618deb894ace88b5385526fd"
 },
 "nbformat": 3,
 "nbformat_minor": 0,
 "worksheets": [
  {
   "cells": [
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "%load_ext cythonmagic"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 1
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "%%cython -lcblas\n",
      "import numpy as np\n",
      "\n",
      "cdef extern:\n",
      "    double  ddot_( int* N,  double*   X, int* INCX, double* Y, int* INCY )  nogil\n",
      "    \n",
      "cpdef double dot(double[:] a, double[:] b) nogil:\n",
      "    cdef int inc = 1\n",
      "    cdef int n = a.shape[0]\n",
      "    \n",
      "    return ddot_(&n, &a[0], &inc, &b[0], &inc)\n",
      "    \n",
      "def main():\n",
      "    \n",
      "    a = np.random.rand(100)\n",
      "    b = np.random.rand(100)\n",
      "    s = dot(a,b)\n",
      "    "
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stderr",
       "text": [
        "warning: /Users/noah/.ipython/cython/_cython_magic_31fdc41cb5785073c3693183243db8bf.pyx:10:23: Use boundscheck(False) for faster access\n",
        "warning: /Users/noah/.ipython/cython/_cython_magic_31fdc41cb5785073c3693183243db8bf.pyx:10:36: Use boundscheck(False) for faster access\n"
       ]
      }
     ],
     "prompt_number": 37
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "    a = np.random.rand(100)\n",
      "    b = np.random.rand(100)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 38
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "%timeit dot(a,b)\n",
      "%timeit np.dot(a,b)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "100000 loops, best of 3: 4.03 \u00b5s per loop\n",
        "1000000 loops, best of 3: 1.89 \u00b5s per loop"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n"
       ]
      }
     ],
     "prompt_number": 40
    }
   ],
   "metadata": {}
  }
 ]
}