{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Customizing IPython - Extensions"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Extensions are just Python modules with a special function:\n",
    "\n",
    "```python\n",
    "def load_ipython_extension(ip):\n",
    "    do_anything()\n",
    "```\n",
    "\n",
    "`%load_ext module` imports the module, and calls `module.load_ipython_extension(ip)`\n",
    "with the IPython instance.\n",
    "\n",
    "This allows modules or standalone extensions to manipulate IPython.\n",
    "Most often, extensions define new magics or work with the interactive namespace.\n",
    "\n",
    "Cython is an example of a package that can be used as an IPython extension.\n",
    "This defines a few magics for executing Cython code interactively."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "ERROR: Cell magic `%%cython` not found.\n"
     ]
    }
   ],
   "source": [
    "%%cython\n",
    "\n",
    "cpdef noop():\n",
    "    pass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "%load_ext Cython"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "%%cython\n",
    "cimport numpy\n",
    "\n",
    "cpdef cysum(numpy.ndarray[double] A):\n",
    "    \"\"\"Compute the sum of an array\"\"\"\n",
    "    cdef double a=0\n",
    "    for i in range(A.shape[0]):\n",
    "        a += A[i]\n",
    "    return a\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "def pysum(A):\n",
    "    \"\"\"Compute the sum of an array\"\"\"\n",
    "    a = 0\n",
    "    for i in range(A.shape[0]):\n",
    "        a += A[i]\n",
    "    return a\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Python 100 10000 loops, best of 3: 24.8 µs per loop\n",
      "np.sum 100 The slowest run took 15.82 times longer than the fastest. This could mean that an intermediate result is being cached \n",
      "100000 loops, best of 3: 5.38 µs per loop\n",
      "Cython 100 The slowest run took 10.16 times longer than the fastest. This could mean that an intermediate result is being cached \n",
      "1000000 loops, best of 3: 1.4 µs per loop\n",
      "Python 1000 1000 loops, best of 3: 242 µs per loop\n",
      "np.sum 1000 The slowest run took 9.22 times longer than the fastest. This could mean that an intermediate result is being cached \n",
      "100000 loops, best of 3: 6.81 µs per loop\n",
      "Cython 1000 The slowest run took 5.86 times longer than the fastest. This could mean that an intermediate result is being cached \n",
      "100000 loops, best of 3: 2.96 µs per loop\n",
      "Python 10000 100 loops, best of 3: 2.44 ms per loop\n",
      "np.sum 10000 The slowest run took 5.32 times longer than the fastest. This could mean that an intermediate result is being cached \n",
      "100000 loops, best of 3: 14.8 µs per loop\n",
      "Cython 10000 100000 loops, best of 3: 18.7 µs per loop\n"
     ]
    }
   ],
   "source": [
    "for sz in (100, 1000, 10000):\n",
    "    A = np.random.random(sz)\n",
    "    print(\"Python %i\" % sz, end=' ')\n",
    "    %timeit pysum(A)\n",
    "    print(\"np.sum %i\" % sz, end=' ')\n",
    "    %timeit A.sum()\n",
    "    print(\"Cython %i\" % sz, end=' ')\n",
    "    %timeit cysum(A)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's see what Cython's `load_ipython_extension` function looks like"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "import Cython"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "Cython.load_ipython_extension??"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "from Cython.Build.IpythonMagic import CythonMagics\n",
    "CythonMagics??"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Our own extension"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Loading an extension can do as much or as little as you want.\n",
    "\n",
    "Since we have been defining our timer magics, let's create an extension to make them available in any IPython session."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "%pycat soln/mymagics.py"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`%install_ext` is a function that can take any file path or URL, and puts the target into IPYTHONDIR/extensions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Installed mymagics.py. To use it, type:\n",
      "  %load_ext mymagics\n"
     ]
    }
   ],
   "source": [
    "%install_ext soln/mymagics.py"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "%load_ext mymagics"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "101 ms\n"
     ]
    }
   ],
   "source": [
    "import time\n",
    "%tic\n",
    "time.sleep(0.1)\n",
    "%toc"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "hello\n"
     ]
    },
    {
     "data": {
      "image/png": [
       "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\n"
      ],
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f3afa3941d0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%nbrun _Sample"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "For some example extensions, see [this repository](http://github.com/minrk/ipython_extensions).\n",
    "\n",
    "Now we can get our magics with a single `%load_ext` call.\n",
    "Let's move on to [Configuring IPython](Customizing%20IPython%20-%20Config.ipynb),\n",
    "so we can see how to load our extension at startup."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.4.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
