{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Magic functions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "IPython has a set of predefined ‘magic functions’ that you can call with a command line style syntax. There are two kinds of magics, line-oriented and cell-oriented: \n", " \n", "- **Line magics** are prefixed with the `%` character and work much like OS command-line calls: they get as an argument the rest of the line, where arguments are passed without parentheses or quotes. \n", " \n", "- **Cell magics** are prefixed with a double `%%`, and they are functions that get as an argument not only the rest of the line, but also the lines below it in a separate argument." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%magic" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "data": { "application/json": { "cell": { "!": "OSMagics", "HTML": "Other", "SVG": "Other", "bash": "Other", "capture": "ExecutionMagics", "debug": "ExecutionMagics", "file": "Other", "html": "DisplayMagics", "javascript": "DisplayMagics", "latex": "DisplayMagics", "perl": "Other", "prun": "ExecutionMagics", "pypy": "Other", "python": "Other", "python2": "Other", "python3": "Other", "ruby": "Other", "script": "ScriptMagics", "sh": "Other", "svg": "DisplayMagics", "sx": "OSMagics", "system": "OSMagics", "time": "ExecutionMagics", "timeit": "ExecutionMagics", "writefile": "OSMagics" }, "line": { "alias": "OSMagics", "alias_magic": "BasicMagics", "autocall": "AutoMagics", "automagic": "AutoMagics", "autosave": "KernelMagics", "bookmark": "OSMagics", "cat": "Other", "cd": "OSMagics", "clear": "KernelMagics", "colors": "BasicMagics", "config": "ConfigMagics", "connect_info": "KernelMagics", "cp": "Other", "debug": "ExecutionMagics", "dhist": "OSMagics", "dirs": "OSMagics", "doctest_mode": "BasicMagics", "ed": "Other", "edit": "KernelMagics", "env": "OSMagics", "gui": "BasicMagics", "hist": "Other", "history": "HistoryMagics", "install_default_config": "DeprecatedMagics", "install_ext": "ExtensionMagics", "install_profiles": "DeprecatedMagics", "killbgscripts": "ScriptMagics", "ldir": "Other", "less": "KernelMagics", "lf": "Other", "lk": "Other", "ll": "Other", "load": "CodeMagics", "load_ext": "ExtensionMagics", "loadpy": "CodeMagics", "logoff": "LoggingMagics", "logon": "LoggingMagics", "logstart": "LoggingMagics", "logstate": "LoggingMagics", "logstop": "LoggingMagics", "ls": "Other", "lsmagic": "BasicMagics", "lx": "Other", "macro": "ExecutionMagics", "magic": "BasicMagics", "man": "KernelMagics", "matplotlib": "PylabMagics", "mkdir": "Other", "more": "KernelMagics", "mv": "Other", "notebook": "BasicMagics", "page": "BasicMagics", "pastebin": "CodeMagics", "pdb": "ExecutionMagics", "pdef": "NamespaceMagics", "pdoc": "NamespaceMagics", "pfile": "NamespaceMagics", "pinfo": "NamespaceMagics", "pinfo2": "NamespaceMagics", "popd": "OSMagics", "pprint": "BasicMagics", "precision": "BasicMagics", "profile": "BasicMagics", "prun": "ExecutionMagics", "psearch": "NamespaceMagics", "psource": "NamespaceMagics", "pushd": "OSMagics", "pwd": "OSMagics", "pycat": "OSMagics", "pylab": "PylabMagics", "qtconsole": "KernelMagics", "quickref": "BasicMagics", "recall": "HistoryMagics", "rehashx": "OSMagics", "reload_ext": "ExtensionMagics", "rep": "Other", "rerun": "HistoryMagics", "reset": "NamespaceMagics", "reset_selective": "NamespaceMagics", "rm": "Other", "rmdir": "Other", "run": "ExecutionMagics", "save": "CodeMagics", "sc": "OSMagics", "set_env": "OSMagics", "store": "StoreMagics", "sx": "OSMagics", "system": "OSMagics", "tb": "ExecutionMagics", "time": "ExecutionMagics", "timeit": "ExecutionMagics", "unalias": "OSMagics", "unload_ext": "ExtensionMagics", "who": "NamespaceMagics", "who_ls": "NamespaceMagics", "whos": "NamespaceMagics", "xdel": "NamespaceMagics", "xmode": "BasicMagics" } }, "text/plain": [ "Available line magics:\n", "%alias %alias_magic %autocall %automagic %autosave %bookmark %cat %cd %clear %colors %config %connect_info %cp %debug %dhist %dirs %doctest_mode %ed %edit %env %gui %hist %history %install_default_config %install_ext %install_profiles %killbgscripts %ldir %less %lf %lk %ll %load %load_ext %loadpy %logoff %logon %logstart %logstate %logstop %ls %lsmagic %lx %macro %magic %man %matplotlib %mkdir %more %mv %notebook %page %pastebin %pdb %pdef %pdoc %pfile %pinfo %pinfo2 %popd %pprint %precision %profile %prun %psearch %psource %pushd %pwd %pycat %pylab %qtconsole %quickref %recall %rehashx %reload_ext %rep %rerun %reset %reset_selective %rm %rmdir %run %save %sc %set_env %store %sx %system %tb %time %timeit %unalias %unload_ext %who %who_ls %whos %xdel %xmode\n", "\n", "Available cell magics:\n", "%%! %%HTML %%SVG %%bash %%capture %%debug %%file %%html %%javascript %%latex %%perl %%prun %%pypy %%python %%python2 %%python3 %%ruby %%script %%sh %%svg %%sx %%system %%time %%timeit %%writefile\n", "\n", "Automagic is ON, % prefix IS NOT needed for line magics." ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%lsmagic" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Line magics:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1000 loops, best of 3: 540 µs per loop\n" ] } ], "source": [ "%timeit [n**2 for n in range(10**3)]" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The slowest run took 4.61 times longer than the fastest. This could mean that an intermediate result is being cached \n", "1000000 loops, best of 3: 746 ns per loop\n" ] } ], "source": [ "%timeit map(lambda x: x**2, range(10**3))" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "print(\"Running script...\")\r\n", "x = 12\r\n", "print(\"'x' is now equal to {0:d}.\".format(x))" ] } ], "source": [ "!cat example_script.py" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Running script...\n", "'x' is now equal to 12.\n" ] } ], "source": [ "%run example_script.py" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "12" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Cell magics:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "15 loops, best of 5: 1.03 ms per loop\n" ] } ], "source": [ "%%timeit -n 15 -r 5\n", "\n", "N = 10**3\n", "[n**2 for n in range(N)]\n", "[n**3 for n in range(N)]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Cell magics examples:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Ipython notebook files:\n", "\n", "display.ipynb\n", "enviroment.ipynb\n", "export.ipynb\n", "index.ipynb\n", "installation.ipynb\n", "magics.ipynb\n", "parallel.ipynb\n", "references.ipynb\n", "use_of_ipython.ipynb\n" ] } ], "source": [ "%%bash\n", "\n", "FILES=`ls -1 | grep \"ipynb\"`\n", "\n", "echo -e \"Ipython notebook files:\\n\" \n", "for F in $FILES; do\n", " echo $F\n", "done" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Another interesting cell magic: creates any file you want locally from the notebook:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Overwriting example_file.txt\n" ] } ], "source": [ "%%writefile example_file.txt\n", "My favorite number is 42!" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "My favorite number is 42!" ] } ], "source": [ "!cat example_file.txt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Running code in other languages with special `%%` magics" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "55" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Python\n", "fibonacci = lambda n: 1 if n <= 2 else fibonacci(n - 1) + fibonacci(n - 2)\n", "\n", "fibonacci(10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Perl" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0\n", "1\n", "1\n", "2\n", "3\n", "5\n", "8\n", "13\n", "21\n", "34\n", "55\n" ] } ], "source": [ "%%perl\n", "\n", "sub fibonacci {\n", " $a = 0;\n", " $b = 1;\n", " $n = $_[0];\n", "\n", " for ($i=0; $i<$n; $i++){\n", " printf \"%d\\n\", $a;\n", " $sum = $a + $b;\n", " $a = $b;\n", " $b = $sum;\n", " }\n", " printf \"%d\\n\", $a;\n", "}\n", "\n", "fibonacci(10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Ruby" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0\n", "1\n", "1\n", "2\n", "3\n", "5\n", "8\n", "13\n", "21\n", "34\n", "55\n" ] } ], "source": [ "%%ruby\n", "\n", "def fibSeq(n)\n", " a = [0]\n", " (n+1).times do |i|\n", " if i==0\n", " a[i] = 0\n", " elsif i==1\n", " a[i] = 1\n", " else\n", " a[i] = a[i-1] + a[i-2]\n", " end \n", " end\n", " return a[0..n]\n", "end\n", "\n", "puts fibSeq(10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### R" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# First import the R extension\n", "%reload_ext rpy2.ipython " ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ " [1] 0 1 1 2 3 5 8 13 21 34 55\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%%R\n", "\n", "recfibo <- function(n) {\n", " if ( n < 2 ) n\n", " else Recall(n-1) + Recall(n-2)\n", "}\n", " \n", "print.table(lapply(0:10, recfibo))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Push variables to R" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import numpy as np\n", "\n", "BMI = np.random.normal(24.2, 2.2, 1000)\n", "\n", "%Rpush BMI" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Display plots created in R " ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAeAAAAHgCAYAAAB91L6VAAAD8GlDQ1BJQ0MgUHJvZmlsZQAAOI2N\nVd1v21QUP4lvXKQWP6Cxjg4Vi69VU1u5GxqtxgZJk6XpQhq5zdgqpMl1bhpT1za2021Vn/YCbwz4\nA4CyBx6QeEIaDMT2su0BtElTQRXVJKQ9dNpAaJP2gqpwrq9Tu13GuJGvfznndz7v0TVAx1ea45hJ\nGWDe8l01n5GPn5iWO1YhCc9BJ/RAp6Z7TrpcLgIuxoVH1sNfIcHeNwfa6/9zdVappwMknkJsVz19\nHvFpgJSpO64PIN5G+fAp30Hc8TziHS4miFhheJbjLMMzHB8POFPqKGKWi6TXtSriJcT9MzH5bAzz\nHIK1I08t6hq6zHpRdu2aYdJYuk9Q/881bzZa8Xrx6fLmJo/iu4/VXnfH1BB/rmu5ScQvI77m+Bkm\nfxXxvcZcJY14L0DymZp7pML5yTcW61PvIN6JuGr4halQvmjNlCa4bXJ5zj6qhpxrujeKPYMXEd+q\n00KR5yNAlWZzrF+Ie+uNsdC/MO4tTOZafhbroyXuR3Df08bLiHsQf+ja6gTPWVimZl7l/oUrjl8O\ncxDWLbNU5D6JRL2gxkDu16fGuC054OMhclsyXTOOFEL+kmMGs4i5kfNuQ62EnBuam8tzP+Q+tSqh\nz9SuqpZlvR1EfBiOJTSgYMMM7jpYsAEyqJCHDL4dcFFTAwNMlFDUUpQYiadhDmXteeWAw3HEmA2s\n15k1RmnP4RHuhBybdBOF7MfnICmSQ2SYjIBM3iRvkcMki9IRcnDTthyLz2Ld2fTzPjTQK+Mdg8y5\nnkZfFO+se9LQr3/09xZr+5GcaSufeAfAww60mAPx+q8u/bAr8rFCLrx7s+vqEkw8qb+p26n11Aru\nq6m1iJH6PbWGv1VIY25mkNE8PkaQhxfLIF7DZXx80HD/A3l2jLclYs061xNpWCfoB6WHJTjbH0mV\n35Q/lRXlC+W8cndbl9t2SfhU+Fb4UfhO+F74GWThknBZ+Em4InwjXIyd1ePnY/Psg3pb1TJNu15T\nMKWMtFt6ScpKL0ivSMXIn9QtDUlj0h7U7N48t3i8eC0GnMC91dX2sTivgloDTgUVeEGHLTizbf5D\na9JLhkhh29QOs1luMcScmBXTIIt7xRFxSBxnuJWfuAd1I7jntkyd/pgKaIwVr3MgmDo2q8x6IdB5\nQH162mcX7ajtnHGN2bov71OU1+U0fqqoXLD0wX5ZM005UHmySz3qLtDqILDvIL+iH6jB9y2x83ok\n898GOPQX3lk3Itl0A+BrD6D7tUjWh3fis58BXDigN9yF8M5PJH4B8Gr79/F/XRm8m241mw/wvur4\nBGDj42bzn+Vmc+NL9L8GcMn8F1kAcXgSteGGAABAAElEQVR4AeydB3hUVdrH/5MeEhI6gRBa6FV6\nB7EgiAVd3V1x7bouu7K66hZY9kNdV10bYldU3LWLIq6AgjSRqigghF5CIJRQ0yhJZu533hvvkDKT\nTDIzyZ17/+d5JnPn3FPe8zsn973nPc2hKQc6EiABEiABEiCBGiUQVqO5MTMSIAESIAESIAGdABUw\nGwIJkAAJkAAJ1AIBKuBagM4sSYAESIAESIAKmG2ABEiABEiABGqBABVwLUBnliRAAiRAAiRABcw2\nQAIkQAIkQAK1QIAKuBagM0sSIAESIAESoAJmGyABEiABEiCBWiBABVwL0JklCZAACZAACVABsw2Q\nAAmQAAmQQC0QoAKuBejMkgRIgARIgASogNkGSIAESIAESKAWCFAB1wJ0ZkkCJEACJEACVMBsAyRA\nAiRAAiRQCwSogGsBOrMkARIgARIgASpgtgESIAESIAESqAUCVMC1AJ1ZkgAJkAAJkAAVMNsACZAA\nCZAACdQCASrgWoDOLEmABEiABEiACphtgARIgARIgARqgQAVcC1AZ5YkQAIkQAIkQAXMNkACJEAC\nJEACtUCACrgWoDNLEiABEiABEoggAhLwl8D69euxf/9+dzIxMTFo3rw5OnTogKioKLf/kSNHsHbt\nWjRr1gz9+vVz+1d24XK5EBZW8bvi3LlzIeGuuuoqFBUVYf78+Xreo0ePriz5Su+XzN8oa58+fZCc\nnFxp3GAGyM/Px1dffYXMzEx069YNF110Uansjh49itWrV5fyi42NRcOGDdGrVy84HI5S96r6Y+/e\nvdi0aRNSU1PRtWvXqkbH4cOH8d133+nx4uPjS8m/bds27NixQ7/XokUL9O7du8rp+xtBuP7www9o\n3LgxBg0aVO3kVq5ciePHj2P48OGoV69etdNhRAsS0OhIwE8Ct9xyi6b+Ncp92rVrp3399dfu1L/4\n4gs9zLXXXuv2q+hCKT7tnXfe0a677rqKgun3lNLX03Y6nVpubq5+rRRNpfEqCuAp/5tuuklP+8MP\n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\nJZKNIwAAAABJRU5ErkJggg==\n" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%%R\n", "\n", "hist(BMI, freq=FALSE, xlab=\"Body Mass Index\", \n", " main=\"Distribution of Body Mass Index\", \n", " col=\"lightgreen\", \n", " xlim=c(15, 35), ylim=c(0, .20))\n", "\n", "smoothing = curve(dnorm(x, mean=mean(BMI), sd=sd(BMI)), add=TRUE, col=\"darkblue\", lwd=2) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Pull variables from R" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "$x\n", " [1] 15.0 15.2 15.4 15.6 15.8 16.0 16.2 16.4 16.6 16.8 17.0 17.2 17.4 17.6 17.8\n", " [16] 18.0 18.2 18.4 18.6 18.8 19.0 19.2 19.4 19.6 19.8 20.0 20.2 20.4 20.6 20.8\n", " [31] 21.0 21.2 21.4 21.6 21.8 22.0 22.2 22.4 22.6 22.8 23.0 23.2 23.4 23.6 23.8\n", " [46] 24.0 24.2 24.4 24.6 24.8 25.0 25.2 25.4 25.6 25.8 26.0 26.2 26.4 26.6 26.8\n", " [61] 27.0 27.2 27.4 27.6 27.8 28.0 28.2 28.4 28.6 28.8 29.0 29.2 29.4 29.6 29.8\n", " [76] 30.0 30.2 30.4 30.6 30.8 31.0 31.2 31.4 31.6 31.8 32.0 32.2 32.4 32.6 32.8\n", " [91] 33.0 33.2 33.4 33.6 33.8 34.0 34.2 34.4 34.6 34.8 35.0\n", "\n", "$y\n", " [1] 4.174780e-05 6.019590e-05 8.608910e-05 1.221174e-04 1.718124e-04\n", " [6] 2.397617e-04 3.318584e-04 4.555898e-04 6.203589e-04 8.378380e-04\n", " [11] 1.122342e-03 1.491207e-03 1.965165e-03 2.568667e-03 3.330157e-03\n", " [16] 4.282226e-03 5.461631e-03 6.909127e-03 8.669058e-03 1.078869e-02\n", " [21] 1.331721e-02 1.630444e-02 1.979915e-02 2.384708e-02 2.848864e-02\n", " [26] 3.375641e-02 3.967243e-02 4.624547e-02 5.346846e-02 6.131603e-02\n", " [31] 6.974265e-02 7.868116e-02 8.804224e-02 9.771458e-02 1.075661e-01\n", " [36] 1.174464e-01 1.271897e-01 1.366193e-01 1.455527e-01 1.538071e-01\n", " [41] 1.612057e-01 1.675840e-01 1.727955e-01 1.767179e-01 1.792571e-01\n", " [46] 1.803517e-01 1.799750e-01 1.781361e-01 1.748799e-01 1.702847e-01\n", " [51] 1.644596e-01 1.575401e-01 1.496824e-01 1.410582e-01 1.318481e-01\n", " [56] 1.222356e-01 1.124007e-01 1.025153e-01 9.273767e-02 8.320926e-02\n", " [61] 7.405171e-02 6.536518e-02 5.722764e-02 4.969506e-02 4.280244e-02\n", " [66] 3.656552e-02 3.098297e-02 2.603888e-02 2.170548e-02 1.794587e-02\n", " [71] 1.471661e-02 1.197013e-02 9.656903e-03 7.727249e-03 6.132815e-03\n", " [76] 4.827729e-03 3.769414e-03 2.919125e-03 2.242227e-03 1.708262e-03\n", " [81] 1.290854e-03 9.674934e-04 7.192282e-04 5.303144e-04 3.878360e-04\n", " [86] 2.813266e-04 2.024051e-04 1.444375e-04 1.022319e-04 7.176969e-05\n", " [91] 4.997394e-05 3.451390e-05 2.364245e-05 1.606345e-05 1.082513e-05\n", " [96] 7.235617e-06 4.796958e-06 3.154309e-06 2.057266e-06 1.330836e-06\n", "[101] 8.538996e-07\n", "\n", "\n" ] } ], "source": [ "%Rpull smoothing\n", "print(smoothing)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Debug" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def division(n, m):\n", " return n / m" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [ { "ename": "ZeroDivisionError", "evalue": "division by zero", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mZeroDivisionError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mdivision\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mdivision\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m\u001b[0m in \u001b[0;36mdivision\u001b[0;34m(n, m)\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mdivision\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mm\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mn\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mm\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mZeroDivisionError\u001b[0m: division by zero" ] } ], "source": [ "division(0, 2)\n", "division(2, 0)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "> \u001b[0;32m\u001b[0m(2)\u001b[0;36mdivision\u001b[0;34m()\u001b[0m\n", "\u001b[0;32m 1 \u001b[0;31m\u001b[0;32mdef\u001b[0m \u001b[0mdivision\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mm\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0m\u001b[0;32m----> 2 \u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mn\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mm\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0m\n", "ipdb> n\n" ] } ], "source": [ "%debug" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Speed up the execution with Cython" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Cpython\n", "%load_ext Cython" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def squareP(x):\n", " return x * x" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%%cython\n", "\n", "def squareC1(x):\n", " return x * x" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%%cython\n", "\n", "def squareC2(int x):\n", " return x * x" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The slowest run took 15.75 times longer than the fastest. This could mean that an intermediate result is being cached \n", "10000000 loops, best of 3: 153 ns per loop\n" ] } ], "source": [ "%timeit(squareP(32323213))" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The slowest run took 21.67 times longer than the fastest. This could mean that an intermediate result is being cached \n", "10000000 loops, best of 3: 95.3 ns per loop\n" ] } ], "source": [ "%timeit(squareC1(32323213))" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The slowest run took 19.83 times longer than the fastest. This could mean that an intermediate result is being cached \n", "10000000 loops, best of 3: 83.4 ns per loop\n" ] } ], "source": [ "%timeit(squareC2(32323213))" ] } ], "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 }