From 42e3752212fc8adc3dd880f3da13af75b71e2d52 Mon Sep 17 00:00:00 2001
From: Michiel Cottaar <MichielCottaar@gmail.com>
Date: Wed, 21 Feb 2018 15:31:32 +0000
Subject: [PATCH] Updates to speeding up python talk

---
 talks/speed/speed.ipynb | 1602 +++------------------------------------
 1 file changed, 93 insertions(+), 1509 deletions(-)

diff --git a/talks/speed/speed.ipynb b/talks/speed/speed.ipynb
index e6eed32..ee75a45 100644
--- a/talks/speed/speed.ipynb
+++ b/talks/speed/speed.ipynb
@@ -9,7 +9,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 17,
+   "execution_count": null,
    "metadata": {
     "collapsed": true
    },
@@ -20,20 +20,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 18,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "((nan, nan), (-1.0, 4.0), (0.0, 0.0))"
-      ]
-     },
-     "execution_count": 18,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
+   "outputs": [],
    "source": [
     "def root(a, b, c):\n",
     "    D = b ** 2 - 4 * a * c\n",
@@ -47,22 +36,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 19,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "ename": "ValueError",
-     "evalue": "The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()",
-     "traceback": [
-      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
-      "\u001b[0;31mValueError\u001b[0m                                Traceback (most recent call last)",
-      "\u001b[0;32m<ipython-input-19-5d1fed3ed2df>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m      2\u001b[0m \u001b[0mb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrandom\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrandn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1e6\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      3\u001b[0m \u001b[0mc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrandom\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrandn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1e6\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mroot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
-      "\u001b[0;32m<ipython-input-18-54b500cd66b1>\u001b[0m in \u001b[0;36mroot\u001b[0;34m(a, b, c)\u001b[0m\n\u001b[1;32m      1\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mroot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      2\u001b[0m     \u001b[0mD\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mb\u001b[0m \u001b[0;34m**\u001b[0m \u001b[0;36m2\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0;36m4\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mc\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m     \u001b[0;32mif\u001b[0m \u001b[0mD\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[1;32m      4\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnan\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnan\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      5\u001b[0m     \u001b[0mx1\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0mb\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msqrt\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mD\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;36m2\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;31mValueError\u001b[0m: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()"
-     ],
-     "output_type": "error"
-    }
-   ],
+   "outputs": [],
    "source": [
     "a = np.random.randn(int(1e6))\n",
     "b = np.random.randn(int(1e6))\n",
@@ -72,34 +48,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 20,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "CPU times: user 3.64 s, sys: 65.9 ms, total: 3.71 s\n",
-      "Wall time: 3.71 s\n"
-     ]
-    },
-    {
-     "data": {
-      "text/plain": [
-       "array([[-0.55797188,  1.11121928],\n",
-       "       [        nan,         nan],\n",
-       "       [ 0.76166857, -1.70637551],\n",
-       "       ...,\n",
-       "       [-0.56859783,  0.98659831],\n",
-       "       [        nan,         nan],\n",
-       "       [-0.53531175,  0.18339357]])"
-      ]
-     },
-     "execution_count": 20,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
+   "outputs": [],
    "source": [
     "%%time\n",
     "np.array([root(av, bv, cv) for av, bv, cv in zip(a, b, c)])"
@@ -107,7 +58,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 21,
+   "execution_count": null,
    "metadata": {
     "collapsed": true
    },
@@ -119,31 +70,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 22,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "CPU times: user 1.85 s, sys: 71.9 ms, total: 1.92 s\n",
-      "Wall time: 1.92 s\n"
-     ]
-    },
-    {
-     "data": {
-      "text/plain": [
-       "(array([-0.55797188,         nan,  0.76166857, ..., -0.56859783,\n",
-       "                nan, -0.53531175]),\n",
-       " array([ 1.11121928,         nan, -1.70637551, ...,  0.98659831,\n",
-       "                nan,  0.18339357]))"
-      ]
-     },
-     "execution_count": 22,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
+   "outputs": [],
    "source": [
     "%%time\n",
     "root_vec(a, b, c)"
@@ -151,31 +80,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 23,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "CPU times: user 1.66 s, sys: 62.7 ms, total: 1.73 s\n",
-      "Wall time: 1.73 s\n"
-     ]
-    },
-    {
-     "data": {
-      "text/plain": [
-       "(array([-1.72246968, -2.63787563,         nan, ..., -2.20722406,\n",
-       "                nan, -1.84415698]),\n",
-       " array([2.27571708, 2.04353033,        nan, ..., 2.62522454,        nan,\n",
-       "        1.4922388 ]))"
-      ]
-     },
-     "execution_count": 23,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
+   "outputs": [],
    "source": [
     "%%time\n",
     "root_vec(a, b, 7)"
@@ -190,7 +97,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 24,
+   "execution_count": null,
    "metadata": {
     "collapsed": true
    },
@@ -201,7 +108,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 25,
+   "execution_count": null,
    "metadata": {
     "collapsed": true
    },
@@ -212,59 +119,27 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 26,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "3.08 µs ± 192 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "%timeit root(23, 78, 19.0)"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 27,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "The slowest run took 11.09 times longer than the fastest. This could mean that an intermediate result is being cached.\n",
-      "786 ns ± 1.08 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "%timeit root_jit(23, 78, 19.0)"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 28,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "ename": "SystemError",
-     "evalue": "CPUDispatcher(<function root at 0x114035620>) returned a result with an error set",
-     "traceback": [
-      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
-      "\u001b[0;31mValueError\u001b[0m                                Traceback (most recent call last)",
-      "\u001b[0;31mValueError\u001b[0m: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()",
-      "\nThe above exception was the direct cause of the following exception:\n",
-      "\u001b[0;31mSystemError\u001b[0m                               Traceback (most recent call last)",
-      "\u001b[0;32m<timed eval>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n",
-      "\u001b[0;31mSystemError\u001b[0m: CPUDispatcher(<function root at 0x114035620>) returned a result with an error set"
-     ],
-     "output_type": "error"
-    }
-   ],
+   "outputs": [],
    "source": [
     "%%time\n",
     "root_jit(a, b, 7)"
@@ -272,31 +147,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 29,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "CPU times: user 406 ms, sys: 57.2 ms, total: 464 ms\n",
-      "Wall time: 464 ms\n"
-     ]
-    },
-    {
-     "data": {
-      "text/plain": [
-       "(array([-1.72246968, -2.63787563,         nan, ..., -2.20722406,\n",
-       "                nan, -1.84415698]),\n",
-       " array([2.27571708, 2.04353033,        nan, ..., 2.62522454,        nan,\n",
-       "        1.4922388 ]))"
-      ]
-     },
-     "execution_count": 29,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
+   "outputs": [],
    "source": [
     "root_jit_vec = np.vectorize(root_jit)\n",
     "%time root_jit_vec(a, b, 7)"
@@ -304,31 +157,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 30,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "CPU times: user 391 ms, sys: 58.2 ms, total: 449 ms\n",
-      "Wall time: 448 ms\n"
-     ]
-    },
-    {
-     "data": {
-      "text/plain": [
-       "(array([-1.72246968, -2.63787563,         nan, ..., -2.20722406,\n",
-       "                nan, -1.84415698]),\n",
-       " array([2.27571708, 2.04353033,        nan, ..., 2.62522454,        nan,\n",
-       "        1.4922388 ]))"
-      ]
-     },
-     "execution_count": 30,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
+   "outputs": [],
    "source": [
     "@np.vectorize\n",
     "@numba.jit\n",
@@ -344,25 +175,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 31,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "ename": "NotImplementedError",
-     "evalue": "(float64 x 2) cannot be represented as a Numpy dtype",
-     "traceback": [
-      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
-      "\u001b[0;31mNotImplementedError\u001b[0m                       Traceback (most recent call last)",
-      "\u001b[0;32m<timed eval>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n",
-      "\u001b[0;32m~/miniconda3/lib/python3.6/site-packages/numba/npyufunc/dufunc.py\u001b[0m in \u001b[0;36m_compile_for_args\u001b[0;34m(self, *args, **kws)\u001b[0m\n\u001b[1;32m    166\u001b[0m                     \u001b[0margty\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0margty\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    167\u001b[0m                 \u001b[0margtys\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margty\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 168\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_compile_for_argtys\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtuple\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0margtys\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    169\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    170\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0m_compile_for_argtys\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margtys\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mreturn_type\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/miniconda3/lib/python3.6/site-packages/numba/npyufunc/dufunc.py\u001b[0m in \u001b[0;36m_compile_for_argtys\u001b[0;34m(self, argtys, return_type)\u001b[0m\n\u001b[1;32m    188\u001b[0m             cres, argtys, return_type)\n\u001b[1;32m    189\u001b[0m         dtypenums, ptr, env = ufuncbuilder._build_element_wise_ufunc_wrapper(\n\u001b[0;32m--> 190\u001b[0;31m             cres, actual_sig)\n\u001b[0m\u001b[1;32m    191\u001b[0m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_add_loop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mutils\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlongint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mptr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtypenums\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    192\u001b[0m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_keepalive\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mptr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcres\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlibrary\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0menv\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/miniconda3/lib/python3.6/site-packages/numba/npyufunc/ufuncbuilder.py\u001b[0m in \u001b[0;36m_build_element_wise_ufunc_wrapper\u001b[0;34m(cres, signature)\u001b[0m\n\u001b[1;32m    163\u001b[0m     \u001b[0;31m# Get dtypes\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    164\u001b[0m     \u001b[0mdtypenums\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mas_dtype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnum\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0ma\u001b[0m \u001b[0;32min\u001b[0m \u001b[0msignature\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 165\u001b[0;31m     \u001b[0mdtypenums\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mas_dtype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msignature\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreturn_type\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnum\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    166\u001b[0m     \u001b[0;32mreturn\u001b[0m \u001b[0mdtypenums\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mptr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0menv\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    167\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/miniconda3/lib/python3.6/site-packages/numba/numpy_support.py\u001b[0m in \u001b[0;36mas_dtype\u001b[0;34m(nbtype)\u001b[0m\n\u001b[1;32m    134\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mas_dtype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnbtype\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    135\u001b[0m     raise NotImplementedError(\"%r cannot be represented as a Numpy dtype\"\n\u001b[0;32m--> 136\u001b[0;31m                               % (nbtype,))\n\u001b[0m\u001b[1;32m    137\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    138\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;31mNotImplementedError\u001b[0m: (float64 x 2) cannot be represented as a Numpy dtype"
-     ],
-     "output_type": "error"
-    }
-   ],
+   "outputs": [],
    "source": [
     "@numba.vectorize\n",
     "def fast_root(a, b, c):\n",
@@ -384,28 +199,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 32,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "CPU times: user 1.56 s, sys: 3.5 ms, total: 1.56 s\n",
-      "Wall time: 1.56 s\n"
-     ]
-    },
-    {
-     "data": {
-      "text/plain": [
-       "5702887"
-      ]
-     },
-     "execution_count": 32,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
+   "outputs": [],
    "source": [
     "def fib(n):\n",
     "    if n <= 1:\n",
@@ -417,28 +213,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 35,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "CPU times: user 63.4 ms, sys: 1.79 ms, total: 65.2 ms\n",
-      "Wall time: 64.2 ms\n"
-     ]
-    },
-    {
-     "data": {
-      "text/plain": [
-       "5702887"
-      ]
-     },
-     "execution_count": 35,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
+   "outputs": [],
    "source": [
     "@numba.jit\n",
     "def fib_jit(n):\n",
@@ -451,80 +228,36 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 34,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "CPU times: user 1.28 s, sys: 5.26 ms, total: 1.28 s\n",
-      "Wall time: 1.28 s\n"
-     ]
-    },
-    {
-     "data": {
-      "text/plain": [
-       "267914296"
-      ]
-     },
-     "execution_count": 34,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
+   "outputs": [],
    "source": [
     "%time fib_jit(41)"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 103,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      " "
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
-    "%prun fib(33)"
+    "%prun fib_jit(41)"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 104,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      " "
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
-    "%prun fib_jit(41)"
+    "%prun fib(33)"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 112,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "CPU times: user 20 µs, sys: 1 µs, total: 21 µs\n",
-      "Wall time: 24.1 µs\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "from functools import lru_cache\n",
     "@lru_cache(None)\n",
@@ -539,38 +272,8 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "metadata": {
-    "collapsed": true
-   },
-   "outputs": [],
-   "source": [
-    "lru_cache?"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 111,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "CPU times: user 261 µs, sys: 1e+03 ns, total: 262 µs\n",
-      "Wall time: 267 µs\n"
-     ]
-    },
-    {
-     "data": {
-      "text/plain": [
-       "225591516161936330872512695036072072046011324913758190588638866418474627738686883405015987052796968498626"
-      ]
-     },
-     "execution_count": 111,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
+   "outputs": [],
    "source": [
     "%time fib_cache(500)"
    ]
@@ -591,17 +294,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 48,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "139 ms ± 1.16 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "a = np.random.randn(int(1e7))\n",
     "b = np.random.randn(int(1e7))\n",
@@ -610,17 +305,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 49,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "11.4 ms ± 484 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "import numexpr as ne\n",
     "%timeit ne.evaluate('a * b + 4.1 * a < 3 * b')"
@@ -635,36 +322,21 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 54,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "141 ms ± 1 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
-    "%timeit a * np.sqrt(abs(b)) < 3 * b"
+    "c = np.random.randn(int(1e7))\n",
+    "%timeit (-b - np.sqrt(b ** 2 - 4 * a * c) ) / (2 * a)"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 55,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "12.6 ms ± 986 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
-    "%timeit ne.evaluate('a * sqrt(abs(b)) < 3 * b')"
+    "%timeit ne.evaluate('(-b - sqrt(b ** 2 - 4 * a * c) ) / (2 * a)')"
    ]
   },
   {
@@ -687,37 +359,18 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 69,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "The cython extension is already loaded. To reload it, use:\n",
-      "  %reload_ext cython\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "%load_ext cython"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 70,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]\n",
-      "CPU times: user 67.4 ms, sys: 1.22 ms, total: 68.6 ms\n",
-      "Wall time: 68 ms\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "def primes(kmax):\n",
     "    p = {}\n",
@@ -735,528 +388,23 @@
     "            k = k + 1\n",
     "            result.append(n)\n",
     "        n = n + 1\n",
-    "    return result"
+    "    return result\n",
+    "print(primes(10))\n",
+    "%time _ = primes(10000)"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 91,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "data": {
-      "text/html": [
-       "<!DOCTYPE html>\n",
-       "<!-- Generated by Cython 0.26 -->\n",
-       "<html>\n",
-       "<head>\n",
-       "    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n",
-       "    <title>Cython: _cython_magic_52e640a266384bf0478136fe7ab4a75d.pyx</title>\n",
-       "    <style type=\"text/css\">\n",
-       "    \n",
-       "body.cython { font-family: courier; font-size: 12; }\n",
-       "\n",
-       ".cython.tag  {  }\n",
-       ".cython.line { margin: 0em }\n",
-       ".cython.code { font-size: 9; color: #444444; display: none; margin: 0px 0px 0px 8px; border-left: 8px none; }\n",
-       "\n",
-       ".cython.line .run { background-color: #B0FFB0; }\n",
-       ".cython.line .mis { background-color: #FFB0B0; }\n",
-       ".cython.code.run  { border-left: 8px solid #B0FFB0; }\n",
-       ".cython.code.mis  { border-left: 8px solid #FFB0B0; }\n",
-       "\n",
-       ".cython.code .py_c_api  { color: red; }\n",
-       ".cython.code .py_macro_api  { color: #FF7000; }\n",
-       ".cython.code .pyx_c_api  { color: #FF3000; }\n",
-       ".cython.code .pyx_macro_api  { color: #FF7000; }\n",
-       ".cython.code .refnanny  { color: #FFA000; }\n",
-       ".cython.code .trace  { color: #FFA000; }\n",
-       ".cython.code .error_goto  { color: #FFA000; }\n",
-       "\n",
-       ".cython.code .coerce  { color: #008000; border: 1px dotted #008000 }\n",
-       ".cython.code .py_attr { color: #FF0000; font-weight: bold; }\n",
-       ".cython.code .c_attr  { color: #0000FF; }\n",
-       ".cython.code .py_call { color: #FF0000; font-weight: bold; }\n",
-       ".cython.code .c_call  { color: #0000FF; }\n",
-       "\n",
-       ".cython.score-0 {background-color: #FFFFff;}\n",
-       ".cython.score-1 {background-color: #FFFFe7;}\n",
-       ".cython.score-2 {background-color: #FFFFd4;}\n",
-       ".cython.score-3 {background-color: #FFFFc4;}\n",
-       ".cython.score-4 {background-color: #FFFFb6;}\n",
-       ".cython.score-5 {background-color: #FFFFaa;}\n",
-       ".cython.score-6 {background-color: #FFFF9f;}\n",
-       ".cython.score-7 {background-color: #FFFF96;}\n",
-       ".cython.score-8 {background-color: #FFFF8d;}\n",
-       ".cython.score-9 {background-color: #FFFF86;}\n",
-       ".cython.score-10 {background-color: #FFFF7f;}\n",
-       ".cython.score-11 {background-color: #FFFF79;}\n",
-       ".cython.score-12 {background-color: #FFFF73;}\n",
-       ".cython.score-13 {background-color: #FFFF6e;}\n",
-       ".cython.score-14 {background-color: #FFFF6a;}\n",
-       ".cython.score-15 {background-color: #FFFF66;}\n",
-       ".cython.score-16 {background-color: #FFFF62;}\n",
-       ".cython.score-17 {background-color: #FFFF5e;}\n",
-       ".cython.score-18 {background-color: #FFFF5b;}\n",
-       ".cython.score-19 {background-color: #FFFF57;}\n",
-       ".cython.score-20 {background-color: #FFFF55;}\n",
-       ".cython.score-21 {background-color: #FFFF52;}\n",
-       ".cython.score-22 {background-color: #FFFF4f;}\n",
-       ".cython.score-23 {background-color: #FFFF4d;}\n",
-       ".cython.score-24 {background-color: #FFFF4b;}\n",
-       ".cython.score-25 {background-color: #FFFF48;}\n",
-       ".cython.score-26 {background-color: #FFFF46;}\n",
-       ".cython.score-27 {background-color: #FFFF44;}\n",
-       ".cython.score-28 {background-color: #FFFF43;}\n",
-       ".cython.score-29 {background-color: #FFFF41;}\n",
-       ".cython.score-30 {background-color: #FFFF3f;}\n",
-       ".cython.score-31 {background-color: #FFFF3e;}\n",
-       ".cython.score-32 {background-color: #FFFF3c;}\n",
-       ".cython.score-33 {background-color: #FFFF3b;}\n",
-       ".cython.score-34 {background-color: #FFFF39;}\n",
-       ".cython.score-35 {background-color: #FFFF38;}\n",
-       ".cython.score-36 {background-color: #FFFF37;}\n",
-       ".cython.score-37 {background-color: #FFFF36;}\n",
-       ".cython.score-38 {background-color: #FFFF35;}\n",
-       ".cython.score-39 {background-color: #FFFF34;}\n",
-       ".cython.score-40 {background-color: #FFFF33;}\n",
-       ".cython.score-41 {background-color: #FFFF32;}\n",
-       ".cython.score-42 {background-color: #FFFF31;}\n",
-       ".cython.score-43 {background-color: #FFFF30;}\n",
-       ".cython.score-44 {background-color: #FFFF2f;}\n",
-       ".cython.score-45 {background-color: #FFFF2e;}\n",
-       ".cython.score-46 {background-color: #FFFF2d;}\n",
-       ".cython.score-47 {background-color: #FFFF2c;}\n",
-       ".cython.score-48 {background-color: #FFFF2b;}\n",
-       ".cython.score-49 {background-color: #FFFF2b;}\n",
-       ".cython.score-50 {background-color: #FFFF2a;}\n",
-       ".cython.score-51 {background-color: #FFFF29;}\n",
-       ".cython.score-52 {background-color: #FFFF29;}\n",
-       ".cython.score-53 {background-color: #FFFF28;}\n",
-       ".cython.score-54 {background-color: #FFFF27;}\n",
-       ".cython.score-55 {background-color: #FFFF27;}\n",
-       ".cython.score-56 {background-color: #FFFF26;}\n",
-       ".cython.score-57 {background-color: #FFFF26;}\n",
-       ".cython.score-58 {background-color: #FFFF25;}\n",
-       ".cython.score-59 {background-color: #FFFF24;}\n",
-       ".cython.score-60 {background-color: #FFFF24;}\n",
-       ".cython.score-61 {background-color: #FFFF23;}\n",
-       ".cython.score-62 {background-color: #FFFF23;}\n",
-       ".cython.score-63 {background-color: #FFFF22;}\n",
-       ".cython.score-64 {background-color: #FFFF22;}\n",
-       ".cython.score-65 {background-color: #FFFF22;}\n",
-       ".cython.score-66 {background-color: #FFFF21;}\n",
-       ".cython.score-67 {background-color: #FFFF21;}\n",
-       ".cython.score-68 {background-color: #FFFF20;}\n",
-       ".cython.score-69 {background-color: #FFFF20;}\n",
-       ".cython.score-70 {background-color: #FFFF1f;}\n",
-       ".cython.score-71 {background-color: #FFFF1f;}\n",
-       ".cython.score-72 {background-color: #FFFF1f;}\n",
-       ".cython.score-73 {background-color: #FFFF1e;}\n",
-       ".cython.score-74 {background-color: #FFFF1e;}\n",
-       ".cython.score-75 {background-color: #FFFF1e;}\n",
-       ".cython.score-76 {background-color: #FFFF1d;}\n",
-       ".cython.score-77 {background-color: #FFFF1d;}\n",
-       ".cython.score-78 {background-color: #FFFF1c;}\n",
-       ".cython.score-79 {background-color: #FFFF1c;}\n",
-       ".cython.score-80 {background-color: #FFFF1c;}\n",
-       ".cython.score-81 {background-color: #FFFF1c;}\n",
-       ".cython.score-82 {background-color: #FFFF1b;}\n",
-       ".cython.score-83 {background-color: #FFFF1b;}\n",
-       ".cython.score-84 {background-color: #FFFF1b;}\n",
-       ".cython.score-85 {background-color: #FFFF1a;}\n",
-       ".cython.score-86 {background-color: #FFFF1a;}\n",
-       ".cython.score-87 {background-color: #FFFF1a;}\n",
-       ".cython.score-88 {background-color: #FFFF1a;}\n",
-       ".cython.score-89 {background-color: #FFFF19;}\n",
-       ".cython.score-90 {background-color: #FFFF19;}\n",
-       ".cython.score-91 {background-color: #FFFF19;}\n",
-       ".cython.score-92 {background-color: #FFFF19;}\n",
-       ".cython.score-93 {background-color: #FFFF18;}\n",
-       ".cython.score-94 {background-color: #FFFF18;}\n",
-       ".cython.score-95 {background-color: #FFFF18;}\n",
-       ".cython.score-96 {background-color: #FFFF18;}\n",
-       ".cython.score-97 {background-color: #FFFF17;}\n",
-       ".cython.score-98 {background-color: #FFFF17;}\n",
-       ".cython.score-99 {background-color: #FFFF17;}\n",
-       ".cython.score-100 {background-color: #FFFF17;}\n",
-       ".cython.score-101 {background-color: #FFFF16;}\n",
-       ".cython.score-102 {background-color: #FFFF16;}\n",
-       ".cython.score-103 {background-color: #FFFF16;}\n",
-       ".cython.score-104 {background-color: #FFFF16;}\n",
-       ".cython.score-105 {background-color: #FFFF16;}\n",
-       ".cython.score-106 {background-color: #FFFF15;}\n",
-       ".cython.score-107 {background-color: #FFFF15;}\n",
-       ".cython.score-108 {background-color: #FFFF15;}\n",
-       ".cython.score-109 {background-color: #FFFF15;}\n",
-       ".cython.score-110 {background-color: #FFFF15;}\n",
-       ".cython.score-111 {background-color: #FFFF15;}\n",
-       ".cython.score-112 {background-color: #FFFF14;}\n",
-       ".cython.score-113 {background-color: #FFFF14;}\n",
-       ".cython.score-114 {background-color: #FFFF14;}\n",
-       ".cython.score-115 {background-color: #FFFF14;}\n",
-       ".cython.score-116 {background-color: #FFFF14;}\n",
-       ".cython.score-117 {background-color: #FFFF14;}\n",
-       ".cython.score-118 {background-color: #FFFF13;}\n",
-       ".cython.score-119 {background-color: #FFFF13;}\n",
-       ".cython.score-120 {background-color: #FFFF13;}\n",
-       ".cython.score-121 {background-color: #FFFF13;}\n",
-       ".cython.score-122 {background-color: #FFFF13;}\n",
-       ".cython.score-123 {background-color: #FFFF13;}\n",
-       ".cython.score-124 {background-color: #FFFF13;}\n",
-       ".cython.score-125 {background-color: #FFFF12;}\n",
-       ".cython.score-126 {background-color: #FFFF12;}\n",
-       ".cython.score-127 {background-color: #FFFF12;}\n",
-       ".cython.score-128 {background-color: #FFFF12;}\n",
-       ".cython.score-129 {background-color: #FFFF12;}\n",
-       ".cython.score-130 {background-color: #FFFF12;}\n",
-       ".cython.score-131 {background-color: #FFFF12;}\n",
-       ".cython.score-132 {background-color: #FFFF11;}\n",
-       ".cython.score-133 {background-color: #FFFF11;}\n",
-       ".cython.score-134 {background-color: #FFFF11;}\n",
-       ".cython.score-135 {background-color: #FFFF11;}\n",
-       ".cython.score-136 {background-color: #FFFF11;}\n",
-       ".cython.score-137 {background-color: #FFFF11;}\n",
-       ".cython.score-138 {background-color: #FFFF11;}\n",
-       ".cython.score-139 {background-color: #FFFF11;}\n",
-       ".cython.score-140 {background-color: #FFFF11;}\n",
-       ".cython.score-141 {background-color: #FFFF10;}\n",
-       ".cython.score-142 {background-color: #FFFF10;}\n",
-       ".cython.score-143 {background-color: #FFFF10;}\n",
-       ".cython.score-144 {background-color: #FFFF10;}\n",
-       ".cython.score-145 {background-color: #FFFF10;}\n",
-       ".cython.score-146 {background-color: #FFFF10;}\n",
-       ".cython.score-147 {background-color: #FFFF10;}\n",
-       ".cython.score-148 {background-color: #FFFF10;}\n",
-       ".cython.score-149 {background-color: #FFFF10;}\n",
-       ".cython.score-150 {background-color: #FFFF0f;}\n",
-       ".cython.score-151 {background-color: #FFFF0f;}\n",
-       ".cython.score-152 {background-color: #FFFF0f;}\n",
-       ".cython.score-153 {background-color: #FFFF0f;}\n",
-       ".cython.score-154 {background-color: #FFFF0f;}\n",
-       ".cython.score-155 {background-color: #FFFF0f;}\n",
-       ".cython.score-156 {background-color: #FFFF0f;}\n",
-       ".cython.score-157 {background-color: #FFFF0f;}\n",
-       ".cython.score-158 {background-color: #FFFF0f;}\n",
-       ".cython.score-159 {background-color: #FFFF0f;}\n",
-       ".cython.score-160 {background-color: #FFFF0f;}\n",
-       ".cython.score-161 {background-color: #FFFF0e;}\n",
-       ".cython.score-162 {background-color: #FFFF0e;}\n",
-       ".cython.score-163 {background-color: #FFFF0e;}\n",
-       ".cython.score-164 {background-color: #FFFF0e;}\n",
-       ".cython.score-165 {background-color: #FFFF0e;}\n",
-       ".cython.score-166 {background-color: #FFFF0e;}\n",
-       ".cython.score-167 {background-color: #FFFF0e;}\n",
-       ".cython.score-168 {background-color: #FFFF0e;}\n",
-       ".cython.score-169 {background-color: #FFFF0e;}\n",
-       ".cython.score-170 {background-color: #FFFF0e;}\n",
-       ".cython.score-171 {background-color: #FFFF0e;}\n",
-       ".cython.score-172 {background-color: #FFFF0e;}\n",
-       ".cython.score-173 {background-color: #FFFF0d;}\n",
-       ".cython.score-174 {background-color: #FFFF0d;}\n",
-       ".cython.score-175 {background-color: #FFFF0d;}\n",
-       ".cython.score-176 {background-color: #FFFF0d;}\n",
-       ".cython.score-177 {background-color: #FFFF0d;}\n",
-       ".cython.score-178 {background-color: #FFFF0d;}\n",
-       ".cython.score-179 {background-color: #FFFF0d;}\n",
-       ".cython.score-180 {background-color: #FFFF0d;}\n",
-       ".cython.score-181 {background-color: #FFFF0d;}\n",
-       ".cython.score-182 {background-color: #FFFF0d;}\n",
-       ".cython.score-183 {background-color: #FFFF0d;}\n",
-       ".cython.score-184 {background-color: #FFFF0d;}\n",
-       ".cython.score-185 {background-color: #FFFF0d;}\n",
-       ".cython.score-186 {background-color: #FFFF0d;}\n",
-       ".cython.score-187 {background-color: #FFFF0c;}\n",
-       ".cython.score-188 {background-color: #FFFF0c;}\n",
-       ".cython.score-189 {background-color: #FFFF0c;}\n",
-       ".cython.score-190 {background-color: #FFFF0c;}\n",
-       ".cython.score-191 {background-color: #FFFF0c;}\n",
-       ".cython.score-192 {background-color: #FFFF0c;}\n",
-       ".cython.score-193 {background-color: #FFFF0c;}\n",
-       ".cython.score-194 {background-color: #FFFF0c;}\n",
-       ".cython.score-195 {background-color: #FFFF0c;}\n",
-       ".cython.score-196 {background-color: #FFFF0c;}\n",
-       ".cython.score-197 {background-color: #FFFF0c;}\n",
-       ".cython.score-198 {background-color: #FFFF0c;}\n",
-       ".cython.score-199 {background-color: #FFFF0c;}\n",
-       ".cython.score-200 {background-color: #FFFF0c;}\n",
-       ".cython.score-201 {background-color: #FFFF0c;}\n",
-       ".cython.score-202 {background-color: #FFFF0c;}\n",
-       ".cython.score-203 {background-color: #FFFF0b;}\n",
-       ".cython.score-204 {background-color: #FFFF0b;}\n",
-       ".cython.score-205 {background-color: #FFFF0b;}\n",
-       ".cython.score-206 {background-color: #FFFF0b;}\n",
-       ".cython.score-207 {background-color: #FFFF0b;}\n",
-       ".cython.score-208 {background-color: #FFFF0b;}\n",
-       ".cython.score-209 {background-color: #FFFF0b;}\n",
-       ".cython.score-210 {background-color: #FFFF0b;}\n",
-       ".cython.score-211 {background-color: #FFFF0b;}\n",
-       ".cython.score-212 {background-color: #FFFF0b;}\n",
-       ".cython.score-213 {background-color: #FFFF0b;}\n",
-       ".cython.score-214 {background-color: #FFFF0b;}\n",
-       ".cython.score-215 {background-color: #FFFF0b;}\n",
-       ".cython.score-216 {background-color: #FFFF0b;}\n",
-       ".cython.score-217 {background-color: #FFFF0b;}\n",
-       ".cython.score-218 {background-color: #FFFF0b;}\n",
-       ".cython.score-219 {background-color: #FFFF0b;}\n",
-       ".cython.score-220 {background-color: #FFFF0b;}\n",
-       ".cython.score-221 {background-color: #FFFF0b;}\n",
-       ".cython.score-222 {background-color: #FFFF0a;}\n",
-       ".cython.score-223 {background-color: #FFFF0a;}\n",
-       ".cython.score-224 {background-color: #FFFF0a;}\n",
-       ".cython.score-225 {background-color: #FFFF0a;}\n",
-       ".cython.score-226 {background-color: #FFFF0a;}\n",
-       ".cython.score-227 {background-color: #FFFF0a;}\n",
-       ".cython.score-228 {background-color: #FFFF0a;}\n",
-       ".cython.score-229 {background-color: #FFFF0a;}\n",
-       ".cython.score-230 {background-color: #FFFF0a;}\n",
-       ".cython.score-231 {background-color: #FFFF0a;}\n",
-       ".cython.score-232 {background-color: #FFFF0a;}\n",
-       ".cython.score-233 {background-color: #FFFF0a;}\n",
-       ".cython.score-234 {background-color: #FFFF0a;}\n",
-       ".cython.score-235 {background-color: #FFFF0a;}\n",
-       ".cython.score-236 {background-color: #FFFF0a;}\n",
-       ".cython.score-237 {background-color: #FFFF0a;}\n",
-       ".cython.score-238 {background-color: #FFFF0a;}\n",
-       ".cython.score-239 {background-color: #FFFF0a;}\n",
-       ".cython.score-240 {background-color: #FFFF0a;}\n",
-       ".cython.score-241 {background-color: #FFFF0a;}\n",
-       ".cython.score-242 {background-color: #FFFF0a;}\n",
-       ".cython.score-243 {background-color: #FFFF0a;}\n",
-       ".cython.score-244 {background-color: #FFFF0a;}\n",
-       ".cython.score-245 {background-color: #FFFF0a;}\n",
-       ".cython.score-246 {background-color: #FFFF09;}\n",
-       ".cython.score-247 {background-color: #FFFF09;}\n",
-       ".cython.score-248 {background-color: #FFFF09;}\n",
-       ".cython.score-249 {background-color: #FFFF09;}\n",
-       ".cython.score-250 {background-color: #FFFF09;}\n",
-       ".cython.score-251 {background-color: #FFFF09;}\n",
-       ".cython.score-252 {background-color: #FFFF09;}\n",
-       ".cython.score-253 {background-color: #FFFF09;}\n",
-       ".cython.score-254 {background-color: #FFFF09;}\n",
-       ".cython .hll { background-color: #ffffcc }\n",
-       ".cython  { background: #f8f8f8; }\n",
-       ".cython .c { color: #408080; font-style: italic } /* Comment */\n",
-       ".cython .err { border: 1px solid #FF0000 } /* Error */\n",
-       ".cython .k { color: #008000; font-weight: bold } /* Keyword */\n",
-       ".cython .o { color: #666666 } /* Operator */\n",
-       ".cython .ch { color: #408080; font-style: italic } /* Comment.Hashbang */\n",
-       ".cython .cm { color: #408080; font-style: italic } /* Comment.Multiline */\n",
-       ".cython .cp { color: #BC7A00 } /* Comment.Preproc */\n",
-       ".cython .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */\n",
-       ".cython .c1 { color: #408080; font-style: italic } /* Comment.Single */\n",
-       ".cython .cs { color: #408080; font-style: italic } /* Comment.Special */\n",
-       ".cython .gd { color: #A00000 } /* Generic.Deleted */\n",
-       ".cython .ge { font-style: italic } /* Generic.Emph */\n",
-       ".cython .gr { color: #FF0000 } /* Generic.Error */\n",
-       ".cython .gh { color: #000080; font-weight: bold } /* Generic.Heading */\n",
-       ".cython .gi { color: #00A000 } /* Generic.Inserted */\n",
-       ".cython .go { color: #888888 } /* Generic.Output */\n",
-       ".cython .gp { color: #000080; font-weight: bold } /* Generic.Prompt */\n",
-       ".cython .gs { font-weight: bold } /* Generic.Strong */\n",
-       ".cython .gu { color: #800080; font-weight: bold } /* Generic.Subheading */\n",
-       ".cython .gt { color: #0044DD } /* Generic.Traceback */\n",
-       ".cython .kc { color: #008000; font-weight: bold } /* Keyword.Constant */\n",
-       ".cython .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */\n",
-       ".cython .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */\n",
-       ".cython .kp { color: #008000 } /* Keyword.Pseudo */\n",
-       ".cython .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */\n",
-       ".cython .kt { color: #B00040 } /* Keyword.Type */\n",
-       ".cython .m { color: #666666 } /* Literal.Number */\n",
-       ".cython .s { color: #BA2121 } /* Literal.String */\n",
-       ".cython .na { color: #7D9029 } /* Name.Attribute */\n",
-       ".cython .nb { color: #008000 } /* Name.Builtin */\n",
-       ".cython .nc { color: #0000FF; font-weight: bold } /* Name.Class */\n",
-       ".cython .no { color: #880000 } /* Name.Constant */\n",
-       ".cython .nd { color: #AA22FF } /* Name.Decorator */\n",
-       ".cython .ni { color: #999999; font-weight: bold } /* Name.Entity */\n",
-       ".cython .ne { color: #D2413A; font-weight: bold } /* Name.Exception */\n",
-       ".cython .nf { color: #0000FF } /* Name.Function */\n",
-       ".cython .nl { color: #A0A000 } /* Name.Label */\n",
-       ".cython .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */\n",
-       ".cython .nt { color: #008000; font-weight: bold } /* Name.Tag */\n",
-       ".cython .nv { color: #19177C } /* Name.Variable */\n",
-       ".cython .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */\n",
-       ".cython .w { color: #bbbbbb } /* Text.Whitespace */\n",
-       ".cython .mb { color: #666666 } /* Literal.Number.Bin */\n",
-       ".cython .mf { color: #666666 } /* Literal.Number.Float */\n",
-       ".cython .mh { color: #666666 } /* Literal.Number.Hex */\n",
-       ".cython .mi { color: #666666 } /* Literal.Number.Integer */\n",
-       ".cython .mo { color: #666666 } /* Literal.Number.Oct */\n",
-       ".cython .sa { color: #BA2121 } /* Literal.String.Affix */\n",
-       ".cython .sb { color: #BA2121 } /* Literal.String.Backtick */\n",
-       ".cython .sc { color: #BA2121 } /* Literal.String.Char */\n",
-       ".cython .dl { color: #BA2121 } /* Literal.String.Delimiter */\n",
-       ".cython .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */\n",
-       ".cython .s2 { color: #BA2121 } /* Literal.String.Double */\n",
-       ".cython .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */\n",
-       ".cython .sh { color: #BA2121 } /* Literal.String.Heredoc */\n",
-       ".cython .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */\n",
-       ".cython .sx { color: #008000 } /* Literal.String.Other */\n",
-       ".cython .sr { color: #BB6688 } /* Literal.String.Regex */\n",
-       ".cython .s1 { color: #BA2121 } /* Literal.String.Single */\n",
-       ".cython .ss { color: #19177C } /* Literal.String.Symbol */\n",
-       ".cython .bp { color: #008000 } /* Name.Builtin.Pseudo */\n",
-       ".cython .fm { color: #0000FF } /* Name.Function.Magic */\n",
-       ".cython .vc { color: #19177C } /* Name.Variable.Class */\n",
-       ".cython .vg { color: #19177C } /* Name.Variable.Global */\n",
-       ".cython .vi { color: #19177C } /* Name.Variable.Instance */\n",
-       ".cython .vm { color: #19177C } /* Name.Variable.Magic */\n",
-       ".cython .il { color: #666666 } /* Literal.Number.Integer.Long */\n",
-       "    </style>\n",
-       "    <script>\n",
-       "    function toggleDiv(id) {\n",
-       "        theDiv = id.nextElementSibling\n",
-       "        if (theDiv.style.display != 'block') theDiv.style.display = 'block';\n",
-       "        else theDiv.style.display = 'none';\n",
-       "    }\n",
-       "    </script>\n",
-       "</head>\n",
-       "<body class=\"cython\">\n",
-       "<p><span style=\"border-bottom: solid 1px grey;\">Generated by Cython 0.26</span></p>\n",
-       "<p>\n",
-       "    <span style=\"background-color: #FFFF00\">Yellow lines</span> hint at Python interaction.<br />\n",
-       "    Click on a line that starts with a \"<code>+</code>\" to see the C code that Cython generated for it.\n",
-       "</p>\n",
-       "<div class=\"cython\"><pre class=\"cython line score-24\" onclick='toggleDiv(this)'>+<span class=\"\">01</span>: <span class=\"k\">def</span> <span class=\"nf\">cprimes</span><span class=\"p\">(</span><span class=\"nb\">int</span> <span class=\"n\">kmax</span><span class=\"p\">):</span></pre>\n",
-       "<pre class='cython code score-24 '>/* Python wrapper */\n",
-       "static PyObject *__pyx_pw_46_cython_magic_52e640a266384bf0478136fe7ab4a75d_1cprimes(PyObject *__pyx_self, PyObject *__pyx_arg_kmax); /*proto*/\n",
-       "static PyMethodDef __pyx_mdef_46_cython_magic_52e640a266384bf0478136fe7ab4a75d_1cprimes = {\"cprimes\", (PyCFunction)__pyx_pw_46_cython_magic_52e640a266384bf0478136fe7ab4a75d_1cprimes, METH_O, 0};\n",
-       "static PyObject *__pyx_pw_46_cython_magic_52e640a266384bf0478136fe7ab4a75d_1cprimes(PyObject *__pyx_self, PyObject *__pyx_arg_kmax) {\n",
-       "  int __pyx_v_kmax;\n",
-       "  PyObject *__pyx_r = 0;\n",
-       "  <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n",
-       "  <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"cprimes (wrapper)\", 0);\n",
-       "  assert(__pyx_arg_kmax); {\n",
-       "    __pyx_v_kmax = <span class='pyx_c_api'>__Pyx_PyInt_As_int</span>(__pyx_arg_kmax); if (unlikely((__pyx_v_kmax == (int)-1) &amp;&amp; <span class='py_c_api'>PyErr_Occurred</span>())) __PYX_ERR(0, 1, __pyx_L3_error)\n",
-       "  }\n",
-       "  goto __pyx_L4_argument_unpacking_done;\n",
-       "  __pyx_L3_error:;\n",
-       "  <span class='pyx_c_api'>__Pyx_AddTraceback</span>(\"_cython_magic_52e640a266384bf0478136fe7ab4a75d.cprimes\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n",
-       "  <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n",
-       "  return NULL;\n",
-       "  __pyx_L4_argument_unpacking_done:;\n",
-       "  __pyx_r = __pyx_pf_46_cython_magic_52e640a266384bf0478136fe7ab4a75d_cprimes(__pyx_self, ((int)__pyx_v_kmax));\n",
-       "\n",
-       "  /* function exit code */\n",
-       "  <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n",
-       "  return __pyx_r;\n",
-       "}\n",
-       "\n",
-       "static PyObject *__pyx_pf_46_cython_magic_52e640a266384bf0478136fe7ab4a75d_cprimes(CYTHON_UNUSED PyObject *__pyx_self, int __pyx_v_kmax) {\n",
-       "  int __pyx_v_p[0x3E8];\n",
-       "  PyObject *__pyx_v_result = NULL;\n",
-       "  int __pyx_v_k;\n",
-       "  int __pyx_v_n;\n",
-       "  int __pyx_v_i;\n",
-       "  PyObject *__pyx_r = NULL;\n",
-       "  <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n",
-       "  <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"cprimes\", 0);\n",
-       "/* … */\n",
-       "  /* function exit code */\n",
-       "  __pyx_L1_error:;\n",
-       "  <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_1);\n",
-       "  <span class='pyx_c_api'>__Pyx_AddTraceback</span>(\"_cython_magic_52e640a266384bf0478136fe7ab4a75d.cprimes\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n",
-       "  __pyx_r = NULL;\n",
-       "  __pyx_L0:;\n",
-       "  <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_v_result);\n",
-       "  <span class='refnanny'>__Pyx_XGIVEREF</span>(__pyx_r);\n",
-       "  <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n",
-       "  return __pyx_r;\n",
-       "}\n",
-       "/* … */\n",
-       "  __pyx_tuple_ = <span class='py_c_api'>PyTuple_Pack</span>(7, __pyx_n_s_kmax, __pyx_n_s_kmax, __pyx_n_s_p, __pyx_n_s_result, __pyx_n_s_k, __pyx_n_s_n, __pyx_n_s_i); if (unlikely(!__pyx_tuple_)) __PYX_ERR(0, 1, __pyx_L1_error)\n",
-       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_tuple_);\n",
-       "  <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_tuple_);\n",
-       "/* … */\n",
-       "  __pyx_t_1 = PyCFunction_NewEx(&amp;__pyx_mdef_46_cython_magic_52e640a266384bf0478136fe7ab4a75d_1cprimes, NULL, __pyx_n_s_cython_magic_52e640a266384bf047); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error)\n",
-       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n",
-       "  if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_d, __pyx_n_s_cprimes, __pyx_t_1) &lt; 0) __PYX_ERR(0, 1, __pyx_L1_error)\n",
-       "  <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
-       "</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">02</span>:     <span class=\"k\">cdef</span> <span class=\"kt\">int</span>[1000] <span class=\"nf\">p</span></pre>\n",
-       "<pre class=\"cython line score-5\" onclick='toggleDiv(this)'>+<span class=\"\">03</span>:     <span class=\"n\">result</span> <span class=\"o\">=</span> <span class=\"p\">[]</span></pre>\n",
-       "<pre class='cython code score-5 '>  __pyx_t_1 = <span class='py_c_api'>PyList_New</span>(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3, __pyx_L1_error)\n",
-       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n",
-       "  __pyx_v_result = ((PyObject*)__pyx_t_1);\n",
-       "  __pyx_t_1 = 0;\n",
-       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">04</span>:     <span class=\"k\">if</span> <span class=\"n\">kmax</span> <span class=\"o\">&gt;</span> <span class=\"mf\">1000</span><span class=\"p\">:</span></pre>\n",
-       "<pre class='cython code score-0 '>  __pyx_t_2 = ((__pyx_v_kmax &gt; 0x3E8) != 0);\n",
-       "  if (__pyx_t_2) {\n",
-       "/* … */\n",
-       "  }\n",
-       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">05</span>:         <span class=\"n\">kmax</span> <span class=\"o\">=</span> <span class=\"mf\">1000</span></pre>\n",
-       "<pre class='cython code score-0 '>    __pyx_v_kmax = 0x3E8;\n",
-       "</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">06</span>:     <span class=\"k\">cdef</span> <span class=\"kt\">int</span> <span class=\"nf\">k</span><span class=\"p\">,</span> <span class=\"nf\">n</span><span class=\"p\">,</span> <span class=\"nf\">i</span></pre>\n",
-       "<pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">07</span>:     <span class=\"n\">k</span> <span class=\"o\">=</span> <span class=\"mf\">0</span></pre>\n",
-       "<pre class='cython code score-0 '>  __pyx_v_k = 0;\n",
-       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">08</span>:     <span class=\"n\">n</span> <span class=\"o\">=</span> <span class=\"mf\">2</span></pre>\n",
-       "<pre class='cython code score-0 '>  __pyx_v_n = 2;\n",
-       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">09</span>:     <span class=\"k\">while</span> <span class=\"n\">k</span> <span class=\"o\">&lt;</span> <span class=\"n\">kmax</span><span class=\"p\">:</span></pre>\n",
-       "<pre class='cython code score-0 '>  while (1) {\n",
-       "    __pyx_t_2 = ((__pyx_v_k &lt; __pyx_v_kmax) != 0);\n",
-       "    if (!__pyx_t_2) break;\n",
-       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">10</span>:         <span class=\"n\">i</span> <span class=\"o\">=</span> <span class=\"mf\">0</span></pre>\n",
-       "<pre class='cython code score-0 '>    __pyx_v_i = 0;\n",
-       "</pre><pre class=\"cython line score-5\" onclick='toggleDiv(this)'>+<span class=\"\">11</span>:         <span class=\"k\">while</span> <span class=\"n\">i</span> <span class=\"o\">&lt;</span> <span class=\"n\">k</span> <span class=\"ow\">and</span> <span class=\"n\">n</span> <span class=\"o\">%</span> <span class=\"n\">p</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">]</span> <span class=\"o\">!=</span> <span class=\"mf\">0</span><span class=\"p\">:</span></pre>\n",
-       "<pre class='cython code score-5 '>    while (1) {\n",
-       "      __pyx_t_3 = ((__pyx_v_i &lt; __pyx_v_k) != 0);\n",
-       "      if (__pyx_t_3) {\n",
-       "      } else {\n",
-       "        __pyx_t_2 = __pyx_t_3;\n",
-       "        goto __pyx_L8_bool_binop_done;\n",
-       "      }\n",
-       "      if (unlikely((__pyx_v_p[__pyx_v_i]) == 0)) {\n",
-       "        <span class='py_c_api'>PyErr_SetString</span>(PyExc_ZeroDivisionError, \"integer division or modulo by zero\");\n",
-       "        __PYX_ERR(0, 11, __pyx_L1_error)\n",
-       "      }\n",
-       "      __pyx_t_3 = ((__Pyx_mod_int(__pyx_v_n, (__pyx_v_p[__pyx_v_i])) != 0) != 0);\n",
-       "      __pyx_t_2 = __pyx_t_3;\n",
-       "      __pyx_L8_bool_binop_done:;\n",
-       "      if (!__pyx_t_2) break;\n",
-       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">12</span>:             <span class=\"n\">i</span> <span class=\"o\">=</span> <span class=\"n\">i</span> <span class=\"o\">+</span> <span class=\"mf\">1</span></pre>\n",
-       "<pre class='cython code score-0 '>      __pyx_v_i = (__pyx_v_i + 1);\n",
-       "    }\n",
-       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">13</span>:         <span class=\"k\">if</span> <span class=\"n\">i</span> <span class=\"o\">==</span> <span class=\"n\">k</span><span class=\"p\">:</span></pre>\n",
-       "<pre class='cython code score-0 '>    __pyx_t_2 = ((__pyx_v_i == __pyx_v_k) != 0);\n",
-       "    if (__pyx_t_2) {\n",
-       "/* … */\n",
-       "    }\n",
-       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">14</span>:             <span class=\"n\">p</span><span class=\"p\">[</span><span class=\"n\">k</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">n</span></pre>\n",
-       "<pre class='cython code score-0 '>      (__pyx_v_p[__pyx_v_k]) = __pyx_v_n;\n",
-       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">15</span>:             <span class=\"n\">k</span> <span class=\"o\">=</span> <span class=\"n\">k</span> <span class=\"o\">+</span> <span class=\"mf\">1</span></pre>\n",
-       "<pre class='cython code score-0 '>      __pyx_v_k = (__pyx_v_k + 1);\n",
-       "</pre><pre class=\"cython line score-5\" onclick='toggleDiv(this)'>+<span class=\"\">16</span>:             <span class=\"n\">result</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">n</span><span class=\"p\">)</span></pre>\n",
-       "<pre class='cython code score-5 '>      __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyInt_From_int</span>(__pyx_v_n); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 16, __pyx_L1_error)\n",
-       "      <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n",
-       "      __pyx_t_4 = <span class='pyx_c_api'>__Pyx_PyList_Append</span>(__pyx_v_result, __pyx_t_1); if (unlikely(__pyx_t_4 == -1)) __PYX_ERR(0, 16, __pyx_L1_error)\n",
-       "      <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
-       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">17</span>:         <span class=\"n\">n</span> <span class=\"o\">=</span> <span class=\"n\">n</span> <span class=\"o\">+</span> <span class=\"mf\">1</span></pre>\n",
-       "<pre class='cython code score-0 '>    __pyx_v_n = (__pyx_v_n + 1);\n",
-       "  }\n",
-       "</pre><pre class=\"cython line score-2\" onclick='toggleDiv(this)'>+<span class=\"\">18</span>:     <span class=\"k\">return</span> <span class=\"n\">result</span></pre>\n",
-       "<pre class='cython code score-2 '>  <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_r);\n",
-       "  <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_v_result);\n",
-       "  __pyx_r = __pyx_v_result;\n",
-       "  goto __pyx_L0;\n",
-       "</pre></div></body></html>"
-      ],
-      "text/plain": [
-       "<IPython.core.display.HTML object>"
-      ]
-     },
-     "execution_count": 91,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
+   "outputs": [],
    "source": [
     "%%cython -a\n",
-    "def cprimes(int kmax):\n",
-    "    cdef int[1000] p\n",
+    "def cprimes(kmax):\n",
+    "    p = {}\n",
     "    result = []\n",
     "    if kmax > 1000:\n",
     "        kmax = 1000\n",
-    "    cdef int k, n, i\n",
     "    k = 0\n",
     "    n = 2\n",
     "    while k < kmax:\n",
@@ -1273,19 +421,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 92,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]\n",
-      "CPU times: user 2.2 ms, sys: 10 µs, total: 2.21 ms\n",
-      "Wall time: 2.22 ms\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "print(cprimes(10))\n",
     "%time _ = cprimes(10000)"
@@ -1300,535 +438,41 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 47,
+   "execution_count": null,
    "metadata": {},
    "outputs": [],
    "source": [
-    "#%%cython -a\n",
-    "def fib(n):\n",
+    "%%cython -a\n",
+    "def cfib(n):\n",
     "    if n <= 1:\n",
     "        return 1\n",
     "    else:\n",
-    "        return fib(n-2) + fib(n-1)"
+    "        return cfib(n-2) + cfib(n-1)"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 48,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "CPU times: user 1.48 s, sys: 1.79 ms, total: 1.48 s\n",
-      "Wall time: 1.48 s\n"
-     ]
-    },
-    {
-     "data": {
-      "text/plain": [
-       "5702887"
-      ]
-     },
-     "execution_count": 48,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
+   "outputs": [],
    "source": [
-    "%time fib(33)"
+    "%time cfib(33)"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 49,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "CPU times: user 27.5 ms, sys: 73 µs, total: 27.5 ms\n",
-      "Wall time: 27.5 ms\n"
-     ]
-    },
-    {
-     "data": {
-      "text/plain": [
-       "5702887"
-      ]
-     },
-     "execution_count": 49,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
+   "outputs": [],
    "source": [
     "%time fib_jit(33)"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 56,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "data": {
-      "text/html": [
-       "<!DOCTYPE html>\n",
-       "<!-- Generated by Cython 0.26 -->\n",
-       "<html>\n",
-       "<head>\n",
-       "    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n",
-       "    <title>Cython: _cython_magic_ed1fcd3356d03e7c12842ade7d34bd4b.pyx</title>\n",
-       "    <style type=\"text/css\">\n",
-       "    \n",
-       "body.cython { font-family: courier; font-size: 12; }\n",
-       "\n",
-       ".cython.tag  {  }\n",
-       ".cython.line { margin: 0em }\n",
-       ".cython.code { font-size: 9; color: #444444; display: none; margin: 0px 0px 0px 8px; border-left: 8px none; }\n",
-       "\n",
-       ".cython.line .run { background-color: #B0FFB0; }\n",
-       ".cython.line .mis { background-color: #FFB0B0; }\n",
-       ".cython.code.run  { border-left: 8px solid #B0FFB0; }\n",
-       ".cython.code.mis  { border-left: 8px solid #FFB0B0; }\n",
-       "\n",
-       ".cython.code .py_c_api  { color: red; }\n",
-       ".cython.code .py_macro_api  { color: #FF7000; }\n",
-       ".cython.code .pyx_c_api  { color: #FF3000; }\n",
-       ".cython.code .pyx_macro_api  { color: #FF7000; }\n",
-       ".cython.code .refnanny  { color: #FFA000; }\n",
-       ".cython.code .trace  { color: #FFA000; }\n",
-       ".cython.code .error_goto  { color: #FFA000; }\n",
-       "\n",
-       ".cython.code .coerce  { color: #008000; border: 1px dotted #008000 }\n",
-       ".cython.code .py_attr { color: #FF0000; font-weight: bold; }\n",
-       ".cython.code .c_attr  { color: #0000FF; }\n",
-       ".cython.code .py_call { color: #FF0000; font-weight: bold; }\n",
-       ".cython.code .c_call  { color: #0000FF; }\n",
-       "\n",
-       ".cython.score-0 {background-color: #FFFFff;}\n",
-       ".cython.score-1 {background-color: #FFFFe7;}\n",
-       ".cython.score-2 {background-color: #FFFFd4;}\n",
-       ".cython.score-3 {background-color: #FFFFc4;}\n",
-       ".cython.score-4 {background-color: #FFFFb6;}\n",
-       ".cython.score-5 {background-color: #FFFFaa;}\n",
-       ".cython.score-6 {background-color: #FFFF9f;}\n",
-       ".cython.score-7 {background-color: #FFFF96;}\n",
-       ".cython.score-8 {background-color: #FFFF8d;}\n",
-       ".cython.score-9 {background-color: #FFFF86;}\n",
-       ".cython.score-10 {background-color: #FFFF7f;}\n",
-       ".cython.score-11 {background-color: #FFFF79;}\n",
-       ".cython.score-12 {background-color: #FFFF73;}\n",
-       ".cython.score-13 {background-color: #FFFF6e;}\n",
-       ".cython.score-14 {background-color: #FFFF6a;}\n",
-       ".cython.score-15 {background-color: #FFFF66;}\n",
-       ".cython.score-16 {background-color: #FFFF62;}\n",
-       ".cython.score-17 {background-color: #FFFF5e;}\n",
-       ".cython.score-18 {background-color: #FFFF5b;}\n",
-       ".cython.score-19 {background-color: #FFFF57;}\n",
-       ".cython.score-20 {background-color: #FFFF55;}\n",
-       ".cython.score-21 {background-color: #FFFF52;}\n",
-       ".cython.score-22 {background-color: #FFFF4f;}\n",
-       ".cython.score-23 {background-color: #FFFF4d;}\n",
-       ".cython.score-24 {background-color: #FFFF4b;}\n",
-       ".cython.score-25 {background-color: #FFFF48;}\n",
-       ".cython.score-26 {background-color: #FFFF46;}\n",
-       ".cython.score-27 {background-color: #FFFF44;}\n",
-       ".cython.score-28 {background-color: #FFFF43;}\n",
-       ".cython.score-29 {background-color: #FFFF41;}\n",
-       ".cython.score-30 {background-color: #FFFF3f;}\n",
-       ".cython.score-31 {background-color: #FFFF3e;}\n",
-       ".cython.score-32 {background-color: #FFFF3c;}\n",
-       ".cython.score-33 {background-color: #FFFF3b;}\n",
-       ".cython.score-34 {background-color: #FFFF39;}\n",
-       ".cython.score-35 {background-color: #FFFF38;}\n",
-       ".cython.score-36 {background-color: #FFFF37;}\n",
-       ".cython.score-37 {background-color: #FFFF36;}\n",
-       ".cython.score-38 {background-color: #FFFF35;}\n",
-       ".cython.score-39 {background-color: #FFFF34;}\n",
-       ".cython.score-40 {background-color: #FFFF33;}\n",
-       ".cython.score-41 {background-color: #FFFF32;}\n",
-       ".cython.score-42 {background-color: #FFFF31;}\n",
-       ".cython.score-43 {background-color: #FFFF30;}\n",
-       ".cython.score-44 {background-color: #FFFF2f;}\n",
-       ".cython.score-45 {background-color: #FFFF2e;}\n",
-       ".cython.score-46 {background-color: #FFFF2d;}\n",
-       ".cython.score-47 {background-color: #FFFF2c;}\n",
-       ".cython.score-48 {background-color: #FFFF2b;}\n",
-       ".cython.score-49 {background-color: #FFFF2b;}\n",
-       ".cython.score-50 {background-color: #FFFF2a;}\n",
-       ".cython.score-51 {background-color: #FFFF29;}\n",
-       ".cython.score-52 {background-color: #FFFF29;}\n",
-       ".cython.score-53 {background-color: #FFFF28;}\n",
-       ".cython.score-54 {background-color: #FFFF27;}\n",
-       ".cython.score-55 {background-color: #FFFF27;}\n",
-       ".cython.score-56 {background-color: #FFFF26;}\n",
-       ".cython.score-57 {background-color: #FFFF26;}\n",
-       ".cython.score-58 {background-color: #FFFF25;}\n",
-       ".cython.score-59 {background-color: #FFFF24;}\n",
-       ".cython.score-60 {background-color: #FFFF24;}\n",
-       ".cython.score-61 {background-color: #FFFF23;}\n",
-       ".cython.score-62 {background-color: #FFFF23;}\n",
-       ".cython.score-63 {background-color: #FFFF22;}\n",
-       ".cython.score-64 {background-color: #FFFF22;}\n",
-       ".cython.score-65 {background-color: #FFFF22;}\n",
-       ".cython.score-66 {background-color: #FFFF21;}\n",
-       ".cython.score-67 {background-color: #FFFF21;}\n",
-       ".cython.score-68 {background-color: #FFFF20;}\n",
-       ".cython.score-69 {background-color: #FFFF20;}\n",
-       ".cython.score-70 {background-color: #FFFF1f;}\n",
-       ".cython.score-71 {background-color: #FFFF1f;}\n",
-       ".cython.score-72 {background-color: #FFFF1f;}\n",
-       ".cython.score-73 {background-color: #FFFF1e;}\n",
-       ".cython.score-74 {background-color: #FFFF1e;}\n",
-       ".cython.score-75 {background-color: #FFFF1e;}\n",
-       ".cython.score-76 {background-color: #FFFF1d;}\n",
-       ".cython.score-77 {background-color: #FFFF1d;}\n",
-       ".cython.score-78 {background-color: #FFFF1c;}\n",
-       ".cython.score-79 {background-color: #FFFF1c;}\n",
-       ".cython.score-80 {background-color: #FFFF1c;}\n",
-       ".cython.score-81 {background-color: #FFFF1c;}\n",
-       ".cython.score-82 {background-color: #FFFF1b;}\n",
-       ".cython.score-83 {background-color: #FFFF1b;}\n",
-       ".cython.score-84 {background-color: #FFFF1b;}\n",
-       ".cython.score-85 {background-color: #FFFF1a;}\n",
-       ".cython.score-86 {background-color: #FFFF1a;}\n",
-       ".cython.score-87 {background-color: #FFFF1a;}\n",
-       ".cython.score-88 {background-color: #FFFF1a;}\n",
-       ".cython.score-89 {background-color: #FFFF19;}\n",
-       ".cython.score-90 {background-color: #FFFF19;}\n",
-       ".cython.score-91 {background-color: #FFFF19;}\n",
-       ".cython.score-92 {background-color: #FFFF19;}\n",
-       ".cython.score-93 {background-color: #FFFF18;}\n",
-       ".cython.score-94 {background-color: #FFFF18;}\n",
-       ".cython.score-95 {background-color: #FFFF18;}\n",
-       ".cython.score-96 {background-color: #FFFF18;}\n",
-       ".cython.score-97 {background-color: #FFFF17;}\n",
-       ".cython.score-98 {background-color: #FFFF17;}\n",
-       ".cython.score-99 {background-color: #FFFF17;}\n",
-       ".cython.score-100 {background-color: #FFFF17;}\n",
-       ".cython.score-101 {background-color: #FFFF16;}\n",
-       ".cython.score-102 {background-color: #FFFF16;}\n",
-       ".cython.score-103 {background-color: #FFFF16;}\n",
-       ".cython.score-104 {background-color: #FFFF16;}\n",
-       ".cython.score-105 {background-color: #FFFF16;}\n",
-       ".cython.score-106 {background-color: #FFFF15;}\n",
-       ".cython.score-107 {background-color: #FFFF15;}\n",
-       ".cython.score-108 {background-color: #FFFF15;}\n",
-       ".cython.score-109 {background-color: #FFFF15;}\n",
-       ".cython.score-110 {background-color: #FFFF15;}\n",
-       ".cython.score-111 {background-color: #FFFF15;}\n",
-       ".cython.score-112 {background-color: #FFFF14;}\n",
-       ".cython.score-113 {background-color: #FFFF14;}\n",
-       ".cython.score-114 {background-color: #FFFF14;}\n",
-       ".cython.score-115 {background-color: #FFFF14;}\n",
-       ".cython.score-116 {background-color: #FFFF14;}\n",
-       ".cython.score-117 {background-color: #FFFF14;}\n",
-       ".cython.score-118 {background-color: #FFFF13;}\n",
-       ".cython.score-119 {background-color: #FFFF13;}\n",
-       ".cython.score-120 {background-color: #FFFF13;}\n",
-       ".cython.score-121 {background-color: #FFFF13;}\n",
-       ".cython.score-122 {background-color: #FFFF13;}\n",
-       ".cython.score-123 {background-color: #FFFF13;}\n",
-       ".cython.score-124 {background-color: #FFFF13;}\n",
-       ".cython.score-125 {background-color: #FFFF12;}\n",
-       ".cython.score-126 {background-color: #FFFF12;}\n",
-       ".cython.score-127 {background-color: #FFFF12;}\n",
-       ".cython.score-128 {background-color: #FFFF12;}\n",
-       ".cython.score-129 {background-color: #FFFF12;}\n",
-       ".cython.score-130 {background-color: #FFFF12;}\n",
-       ".cython.score-131 {background-color: #FFFF12;}\n",
-       ".cython.score-132 {background-color: #FFFF11;}\n",
-       ".cython.score-133 {background-color: #FFFF11;}\n",
-       ".cython.score-134 {background-color: #FFFF11;}\n",
-       ".cython.score-135 {background-color: #FFFF11;}\n",
-       ".cython.score-136 {background-color: #FFFF11;}\n",
-       ".cython.score-137 {background-color: #FFFF11;}\n",
-       ".cython.score-138 {background-color: #FFFF11;}\n",
-       ".cython.score-139 {background-color: #FFFF11;}\n",
-       ".cython.score-140 {background-color: #FFFF11;}\n",
-       ".cython.score-141 {background-color: #FFFF10;}\n",
-       ".cython.score-142 {background-color: #FFFF10;}\n",
-       ".cython.score-143 {background-color: #FFFF10;}\n",
-       ".cython.score-144 {background-color: #FFFF10;}\n",
-       ".cython.score-145 {background-color: #FFFF10;}\n",
-       ".cython.score-146 {background-color: #FFFF10;}\n",
-       ".cython.score-147 {background-color: #FFFF10;}\n",
-       ".cython.score-148 {background-color: #FFFF10;}\n",
-       ".cython.score-149 {background-color: #FFFF10;}\n",
-       ".cython.score-150 {background-color: #FFFF0f;}\n",
-       ".cython.score-151 {background-color: #FFFF0f;}\n",
-       ".cython.score-152 {background-color: #FFFF0f;}\n",
-       ".cython.score-153 {background-color: #FFFF0f;}\n",
-       ".cython.score-154 {background-color: #FFFF0f;}\n",
-       ".cython.score-155 {background-color: #FFFF0f;}\n",
-       ".cython.score-156 {background-color: #FFFF0f;}\n",
-       ".cython.score-157 {background-color: #FFFF0f;}\n",
-       ".cython.score-158 {background-color: #FFFF0f;}\n",
-       ".cython.score-159 {background-color: #FFFF0f;}\n",
-       ".cython.score-160 {background-color: #FFFF0f;}\n",
-       ".cython.score-161 {background-color: #FFFF0e;}\n",
-       ".cython.score-162 {background-color: #FFFF0e;}\n",
-       ".cython.score-163 {background-color: #FFFF0e;}\n",
-       ".cython.score-164 {background-color: #FFFF0e;}\n",
-       ".cython.score-165 {background-color: #FFFF0e;}\n",
-       ".cython.score-166 {background-color: #FFFF0e;}\n",
-       ".cython.score-167 {background-color: #FFFF0e;}\n",
-       ".cython.score-168 {background-color: #FFFF0e;}\n",
-       ".cython.score-169 {background-color: #FFFF0e;}\n",
-       ".cython.score-170 {background-color: #FFFF0e;}\n",
-       ".cython.score-171 {background-color: #FFFF0e;}\n",
-       ".cython.score-172 {background-color: #FFFF0e;}\n",
-       ".cython.score-173 {background-color: #FFFF0d;}\n",
-       ".cython.score-174 {background-color: #FFFF0d;}\n",
-       ".cython.score-175 {background-color: #FFFF0d;}\n",
-       ".cython.score-176 {background-color: #FFFF0d;}\n",
-       ".cython.score-177 {background-color: #FFFF0d;}\n",
-       ".cython.score-178 {background-color: #FFFF0d;}\n",
-       ".cython.score-179 {background-color: #FFFF0d;}\n",
-       ".cython.score-180 {background-color: #FFFF0d;}\n",
-       ".cython.score-181 {background-color: #FFFF0d;}\n",
-       ".cython.score-182 {background-color: #FFFF0d;}\n",
-       ".cython.score-183 {background-color: #FFFF0d;}\n",
-       ".cython.score-184 {background-color: #FFFF0d;}\n",
-       ".cython.score-185 {background-color: #FFFF0d;}\n",
-       ".cython.score-186 {background-color: #FFFF0d;}\n",
-       ".cython.score-187 {background-color: #FFFF0c;}\n",
-       ".cython.score-188 {background-color: #FFFF0c;}\n",
-       ".cython.score-189 {background-color: #FFFF0c;}\n",
-       ".cython.score-190 {background-color: #FFFF0c;}\n",
-       ".cython.score-191 {background-color: #FFFF0c;}\n",
-       ".cython.score-192 {background-color: #FFFF0c;}\n",
-       ".cython.score-193 {background-color: #FFFF0c;}\n",
-       ".cython.score-194 {background-color: #FFFF0c;}\n",
-       ".cython.score-195 {background-color: #FFFF0c;}\n",
-       ".cython.score-196 {background-color: #FFFF0c;}\n",
-       ".cython.score-197 {background-color: #FFFF0c;}\n",
-       ".cython.score-198 {background-color: #FFFF0c;}\n",
-       ".cython.score-199 {background-color: #FFFF0c;}\n",
-       ".cython.score-200 {background-color: #FFFF0c;}\n",
-       ".cython.score-201 {background-color: #FFFF0c;}\n",
-       ".cython.score-202 {background-color: #FFFF0c;}\n",
-       ".cython.score-203 {background-color: #FFFF0b;}\n",
-       ".cython.score-204 {background-color: #FFFF0b;}\n",
-       ".cython.score-205 {background-color: #FFFF0b;}\n",
-       ".cython.score-206 {background-color: #FFFF0b;}\n",
-       ".cython.score-207 {background-color: #FFFF0b;}\n",
-       ".cython.score-208 {background-color: #FFFF0b;}\n",
-       ".cython.score-209 {background-color: #FFFF0b;}\n",
-       ".cython.score-210 {background-color: #FFFF0b;}\n",
-       ".cython.score-211 {background-color: #FFFF0b;}\n",
-       ".cython.score-212 {background-color: #FFFF0b;}\n",
-       ".cython.score-213 {background-color: #FFFF0b;}\n",
-       ".cython.score-214 {background-color: #FFFF0b;}\n",
-       ".cython.score-215 {background-color: #FFFF0b;}\n",
-       ".cython.score-216 {background-color: #FFFF0b;}\n",
-       ".cython.score-217 {background-color: #FFFF0b;}\n",
-       ".cython.score-218 {background-color: #FFFF0b;}\n",
-       ".cython.score-219 {background-color: #FFFF0b;}\n",
-       ".cython.score-220 {background-color: #FFFF0b;}\n",
-       ".cython.score-221 {background-color: #FFFF0b;}\n",
-       ".cython.score-222 {background-color: #FFFF0a;}\n",
-       ".cython.score-223 {background-color: #FFFF0a;}\n",
-       ".cython.score-224 {background-color: #FFFF0a;}\n",
-       ".cython.score-225 {background-color: #FFFF0a;}\n",
-       ".cython.score-226 {background-color: #FFFF0a;}\n",
-       ".cython.score-227 {background-color: #FFFF0a;}\n",
-       ".cython.score-228 {background-color: #FFFF0a;}\n",
-       ".cython.score-229 {background-color: #FFFF0a;}\n",
-       ".cython.score-230 {background-color: #FFFF0a;}\n",
-       ".cython.score-231 {background-color: #FFFF0a;}\n",
-       ".cython.score-232 {background-color: #FFFF0a;}\n",
-       ".cython.score-233 {background-color: #FFFF0a;}\n",
-       ".cython.score-234 {background-color: #FFFF0a;}\n",
-       ".cython.score-235 {background-color: #FFFF0a;}\n",
-       ".cython.score-236 {background-color: #FFFF0a;}\n",
-       ".cython.score-237 {background-color: #FFFF0a;}\n",
-       ".cython.score-238 {background-color: #FFFF0a;}\n",
-       ".cython.score-239 {background-color: #FFFF0a;}\n",
-       ".cython.score-240 {background-color: #FFFF0a;}\n",
-       ".cython.score-241 {background-color: #FFFF0a;}\n",
-       ".cython.score-242 {background-color: #FFFF0a;}\n",
-       ".cython.score-243 {background-color: #FFFF0a;}\n",
-       ".cython.score-244 {background-color: #FFFF0a;}\n",
-       ".cython.score-245 {background-color: #FFFF0a;}\n",
-       ".cython.score-246 {background-color: #FFFF09;}\n",
-       ".cython.score-247 {background-color: #FFFF09;}\n",
-       ".cython.score-248 {background-color: #FFFF09;}\n",
-       ".cython.score-249 {background-color: #FFFF09;}\n",
-       ".cython.score-250 {background-color: #FFFF09;}\n",
-       ".cython.score-251 {background-color: #FFFF09;}\n",
-       ".cython.score-252 {background-color: #FFFF09;}\n",
-       ".cython.score-253 {background-color: #FFFF09;}\n",
-       ".cython.score-254 {background-color: #FFFF09;}\n",
-       ".cython .hll { background-color: #ffffcc }\n",
-       ".cython  { background: #f8f8f8; }\n",
-       ".cython .c { color: #408080; font-style: italic } /* Comment */\n",
-       ".cython .err { border: 1px solid #FF0000 } /* Error */\n",
-       ".cython .k { color: #008000; font-weight: bold } /* Keyword */\n",
-       ".cython .o { color: #666666 } /* Operator */\n",
-       ".cython .ch { color: #408080; font-style: italic } /* Comment.Hashbang */\n",
-       ".cython .cm { color: #408080; font-style: italic } /* Comment.Multiline */\n",
-       ".cython .cp { color: #BC7A00 } /* Comment.Preproc */\n",
-       ".cython .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */\n",
-       ".cython .c1 { color: #408080; font-style: italic } /* Comment.Single */\n",
-       ".cython .cs { color: #408080; font-style: italic } /* Comment.Special */\n",
-       ".cython .gd { color: #A00000 } /* Generic.Deleted */\n",
-       ".cython .ge { font-style: italic } /* Generic.Emph */\n",
-       ".cython .gr { color: #FF0000 } /* Generic.Error */\n",
-       ".cython .gh { color: #000080; font-weight: bold } /* Generic.Heading */\n",
-       ".cython .gi { color: #00A000 } /* Generic.Inserted */\n",
-       ".cython .go { color: #888888 } /* Generic.Output */\n",
-       ".cython .gp { color: #000080; font-weight: bold } /* Generic.Prompt */\n",
-       ".cython .gs { font-weight: bold } /* Generic.Strong */\n",
-       ".cython .gu { color: #800080; font-weight: bold } /* Generic.Subheading */\n",
-       ".cython .gt { color: #0044DD } /* Generic.Traceback */\n",
-       ".cython .kc { color: #008000; font-weight: bold } /* Keyword.Constant */\n",
-       ".cython .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */\n",
-       ".cython .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */\n",
-       ".cython .kp { color: #008000 } /* Keyword.Pseudo */\n",
-       ".cython .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */\n",
-       ".cython .kt { color: #B00040 } /* Keyword.Type */\n",
-       ".cython .m { color: #666666 } /* Literal.Number */\n",
-       ".cython .s { color: #BA2121 } /* Literal.String */\n",
-       ".cython .na { color: #7D9029 } /* Name.Attribute */\n",
-       ".cython .nb { color: #008000 } /* Name.Builtin */\n",
-       ".cython .nc { color: #0000FF; font-weight: bold } /* Name.Class */\n",
-       ".cython .no { color: #880000 } /* Name.Constant */\n",
-       ".cython .nd { color: #AA22FF } /* Name.Decorator */\n",
-       ".cython .ni { color: #999999; font-weight: bold } /* Name.Entity */\n",
-       ".cython .ne { color: #D2413A; font-weight: bold } /* Name.Exception */\n",
-       ".cython .nf { color: #0000FF } /* Name.Function */\n",
-       ".cython .nl { color: #A0A000 } /* Name.Label */\n",
-       ".cython .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */\n",
-       ".cython .nt { color: #008000; font-weight: bold } /* Name.Tag */\n",
-       ".cython .nv { color: #19177C } /* Name.Variable */\n",
-       ".cython .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */\n",
-       ".cython .w { color: #bbbbbb } /* Text.Whitespace */\n",
-       ".cython .mb { color: #666666 } /* Literal.Number.Bin */\n",
-       ".cython .mf { color: #666666 } /* Literal.Number.Float */\n",
-       ".cython .mh { color: #666666 } /* Literal.Number.Hex */\n",
-       ".cython .mi { color: #666666 } /* Literal.Number.Integer */\n",
-       ".cython .mo { color: #666666 } /* Literal.Number.Oct */\n",
-       ".cython .sa { color: #BA2121 } /* Literal.String.Affix */\n",
-       ".cython .sb { color: #BA2121 } /* Literal.String.Backtick */\n",
-       ".cython .sc { color: #BA2121 } /* Literal.String.Char */\n",
-       ".cython .dl { color: #BA2121 } /* Literal.String.Delimiter */\n",
-       ".cython .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */\n",
-       ".cython .s2 { color: #BA2121 } /* Literal.String.Double */\n",
-       ".cython .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */\n",
-       ".cython .sh { color: #BA2121 } /* Literal.String.Heredoc */\n",
-       ".cython .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */\n",
-       ".cython .sx { color: #008000 } /* Literal.String.Other */\n",
-       ".cython .sr { color: #BB6688 } /* Literal.String.Regex */\n",
-       ".cython .s1 { color: #BA2121 } /* Literal.String.Single */\n",
-       ".cython .ss { color: #19177C } /* Literal.String.Symbol */\n",
-       ".cython .bp { color: #008000 } /* Name.Builtin.Pseudo */\n",
-       ".cython .fm { color: #0000FF } /* Name.Function.Magic */\n",
-       ".cython .vc { color: #19177C } /* Name.Variable.Class */\n",
-       ".cython .vg { color: #19177C } /* Name.Variable.Global */\n",
-       ".cython .vi { color: #19177C } /* Name.Variable.Instance */\n",
-       ".cython .vm { color: #19177C } /* Name.Variable.Magic */\n",
-       ".cython .il { color: #666666 } /* Literal.Number.Integer.Long */\n",
-       "    </style>\n",
-       "    <script>\n",
-       "    function toggleDiv(id) {\n",
-       "        theDiv = id.nextElementSibling\n",
-       "        if (theDiv.style.display != 'block') theDiv.style.display = 'block';\n",
-       "        else theDiv.style.display = 'none';\n",
-       "    }\n",
-       "    </script>\n",
-       "</head>\n",
-       "<body class=\"cython\">\n",
-       "<p><span style=\"border-bottom: solid 1px grey;\">Generated by Cython 0.26</span></p>\n",
-       "<p>\n",
-       "    <span style=\"background-color: #FFFF00\">Yellow lines</span> hint at Python interaction.<br />\n",
-       "    Click on a line that starts with a \"<code>+</code>\" to see the C code that Cython generated for it.\n",
-       "</p>\n",
-       "<div class=\"cython\"><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">1</span>: <span class=\"k\">cdef</span> <span class=\"kt\">int</span> <span class=\"nf\">cfib</span><span class=\"p\">(</span><span class=\"nb\">int</span> <span class=\"n\">n</span><span class=\"p\">)</span> <span class=\"k\">nogil</span><span class=\"p\">:</span></pre>\n",
-       "<pre class='cython code score-0 '>static int __pyx_f_46_cython_magic_ed1fcd3356d03e7c12842ade7d34bd4b_cfib(int __pyx_v_n) {\n",
-       "  int __pyx_r;\n",
-       "/* … */\n",
-       "  /* function exit code */\n",
-       "  __pyx_L0:;\n",
-       "  return __pyx_r;\n",
-       "}\n",
-       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">2</span>:     <span class=\"k\">if</span> <span class=\"n\">n</span> <span class=\"o\">&lt;=</span> <span class=\"mf\">1</span><span class=\"p\">:</span></pre>\n",
-       "<pre class='cython code score-0 '>  __pyx_t_1 = ((__pyx_v_n &lt;= 1) != 0);\n",
-       "  if (__pyx_t_1) {\n",
-       "/* … */\n",
-       "  }\n",
-       "</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">3</span>:         <span class=\"k\">return</span> <span class=\"mf\">1</span></pre>\n",
-       "<pre class='cython code score-0 '>    __pyx_r = 1;\n",
-       "    goto __pyx_L0;\n",
-       "</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">4</span>:     <span class=\"k\">else</span><span class=\"p\">:</span></pre>\n",
-       "<pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">5</span>:         <span class=\"k\">return</span> <span class=\"n\">cfib</span><span class=\"p\">(</span><span class=\"n\">n</span><span class=\"o\">-</span><span class=\"mf\">2</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"n\">cfib</span><span class=\"p\">(</span><span class=\"n\">n</span><span class=\"o\">-</span><span class=\"mf\">1</span><span class=\"p\">)</span></pre>\n",
-       "<pre class='cython code score-0 '>  /*else*/ {\n",
-       "    __pyx_r = (__pyx_f_46_cython_magic_ed1fcd3356d03e7c12842ade7d34bd4b_cfib((__pyx_v_n - 2)) + __pyx_f_46_cython_magic_ed1fcd3356d03e7c12842ade7d34bd4b_cfib((__pyx_v_n - 1)));\n",
-       "    goto __pyx_L0;\n",
-       "  }\n",
-       "</pre><pre class=\"cython line score-0\">&#xA0;<span class=\"\">6</span>: </pre>\n",
-       "<pre class=\"cython line score-14\" onclick='toggleDiv(this)'>+<span class=\"\">7</span>: <span class=\"k\">def</span> <span class=\"nf\">fib</span><span class=\"p\">(</span><span class=\"n\">n</span><span class=\"p\">):</span></pre>\n",
-       "<pre class='cython code score-14 '>/* Python wrapper */\n",
-       "static PyObject *__pyx_pw_46_cython_magic_ed1fcd3356d03e7c12842ade7d34bd4b_1fib(PyObject *__pyx_self, PyObject *__pyx_v_n); /*proto*/\n",
-       "static PyMethodDef __pyx_mdef_46_cython_magic_ed1fcd3356d03e7c12842ade7d34bd4b_1fib = {\"fib\", (PyCFunction)__pyx_pw_46_cython_magic_ed1fcd3356d03e7c12842ade7d34bd4b_1fib, METH_O, 0};\n",
-       "static PyObject *__pyx_pw_46_cython_magic_ed1fcd3356d03e7c12842ade7d34bd4b_1fib(PyObject *__pyx_self, PyObject *__pyx_v_n) {\n",
-       "  PyObject *__pyx_r = 0;\n",
-       "  <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n",
-       "  <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"fib (wrapper)\", 0);\n",
-       "  __pyx_r = __pyx_pf_46_cython_magic_ed1fcd3356d03e7c12842ade7d34bd4b_fib(__pyx_self, ((PyObject *)__pyx_v_n));\n",
-       "\n",
-       "  /* function exit code */\n",
-       "  <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n",
-       "  return __pyx_r;\n",
-       "}\n",
-       "\n",
-       "static PyObject *__pyx_pf_46_cython_magic_ed1fcd3356d03e7c12842ade7d34bd4b_fib(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_n) {\n",
-       "  PyObject *__pyx_r = NULL;\n",
-       "  <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n",
-       "  <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"fib\", 0);\n",
-       "/* … */\n",
-       "  /* function exit code */\n",
-       "  __pyx_L1_error:;\n",
-       "  <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_2);\n",
-       "  <span class='pyx_c_api'>__Pyx_AddTraceback</span>(\"_cython_magic_ed1fcd3356d03e7c12842ade7d34bd4b.fib\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n",
-       "  __pyx_r = NULL;\n",
-       "  __pyx_L0:;\n",
-       "  <span class='refnanny'>__Pyx_XGIVEREF</span>(__pyx_r);\n",
-       "  <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n",
-       "  return __pyx_r;\n",
-       "}\n",
-       "/* … */\n",
-       "  __pyx_tuple_ = <span class='py_c_api'>PyTuple_Pack</span>(1, __pyx_n_s_n); if (unlikely(!__pyx_tuple_)) __PYX_ERR(0, 7, __pyx_L1_error)\n",
-       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_tuple_);\n",
-       "  <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_tuple_);\n",
-       "/* … */\n",
-       "  __pyx_t_1 = PyCFunction_NewEx(&amp;__pyx_mdef_46_cython_magic_ed1fcd3356d03e7c12842ade7d34bd4b_1fib, NULL, __pyx_n_s_cython_magic_ed1fcd3356d03e7c12); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 7, __pyx_L1_error)\n",
-       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n",
-       "  if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_d, __pyx_n_s_fib, __pyx_t_1) &lt; 0) __PYX_ERR(0, 7, __pyx_L1_error)\n",
-       "  <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
-       "</pre><pre class=\"cython line score-10\" onclick='toggleDiv(this)'>+<span class=\"\">8</span>:     <span class=\"k\">return</span> <span class=\"n\">cfib</span><span class=\"p\">(</span><span class=\"n\">n</span><span class=\"p\">)</span></pre>\n",
-       "<pre class='cython code score-10 '>  <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_r);\n",
-       "  __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyInt_As_int</span>(__pyx_v_n); if (unlikely((__pyx_t_1 == (int)-1) &amp;&amp; <span class='py_c_api'>PyErr_Occurred</span>())) __PYX_ERR(0, 8, __pyx_L1_error)\n",
-       "  __pyx_t_2 = <span class='pyx_c_api'>__Pyx_PyInt_From_int</span>(__pyx_f_46_cython_magic_ed1fcd3356d03e7c12842ade7d34bd4b_cfib(__pyx_t_1)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 8, __pyx_L1_error)\n",
-       "  <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2);\n",
-       "  __pyx_r = __pyx_t_2;\n",
-       "  __pyx_t_2 = 0;\n",
-       "  goto __pyx_L0;\n",
-       "</pre></div></body></html>"
-      ],
-      "text/plain": [
-       "<IPython.core.display.HTML object>"
-      ]
-     },
-     "execution_count": 56,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
+   "outputs": [],
    "source": [
     "%%cython -a\n",
     "cdef int cfib(int n) nogil:\n",
@@ -1843,28 +487,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 57,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "CPU times: user 10.2 ms, sys: 138 µs, total: 10.4 ms\n",
-      "Wall time: 10.4 ms\n"
-     ]
-    },
-    {
-     "data": {
-      "text/plain": [
-       "5702887"
-      ]
-     },
-     "execution_count": 57,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
+   "outputs": [],
    "source": [
     "%time fib(33)"
    ]
@@ -1879,78 +504,36 @@
   {
    "cell_type": "code",
    "execution_count": null,
-   "metadata": {
-    "collapsed": true
-   },
+   "metadata": {},
    "outputs": [],
    "source": [
     "def root(a, b, c):\n",
     "    D = b ** 2 - 4 * a * c\n",
     "    if D < 0:\n",
-    "        return NAN, NAN\n",
-    "    x1 = (-b + sqrt(D)) / (2 * a)\n",
-    "    x2 = (-b - sqrt(D)) / (2 * a)\n",
-    "    return x1, x2"
+    "        return np.nan, np.nan\n",
+    "    x1 = (-b + np.sqrt(D)) / (2 * a)\n",
+    "    x2 = (-b - np.sqrt(D)) / (2 * a)\n",
+    "    return x1, x2\n",
+    "root(1, 3, 4), root(-1, 3, 4), root(1, 0, 0)"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 68,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "CPU times: user 236 ms, sys: 53.7 ms, total: 290 ms\n",
-      "Wall time: 288 ms\n"
-     ]
-    },
-    {
-     "data": {
-      "text/plain": [
-       "(array([-1.72246969, -2.6378758 ,         nan, ..., -2.20722389,\n",
-       "                nan, -1.84415698]),\n",
-       " array([2.27571702, 2.04353046,        nan, ..., 2.62522459,        nan,\n",
-       "        1.49223876]))"
-      ]
-     },
-     "execution_count": 68,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
+   "outputs": [],
    "source": [
+    "a = np.random.randn(int(1e6))\n",
+    "b = np.random.randn(int(1e6))\n",
+    "c = np.random.randn(int(1e6))\n",
     "%time np.vectorize(root)(a, b, 7)"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 66,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "CPU times: user 353 ms, sys: 57.8 ms, total: 411 ms\n",
-      "Wall time: 410 ms\n"
-     ]
-    },
-    {
-     "data": {
-      "text/plain": [
-       "(array([-1.72246968, -2.63787563,         nan, ..., -2.20722406,\n",
-       "                nan, -1.84415698]),\n",
-       " array([2.27571708, 2.04353033,        nan, ..., 2.62522454,        nan,\n",
-       "        1.4922388 ]))"
-      ]
-     },
-     "execution_count": 66,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
+   "outputs": [],
    "source": [
     "%time root_jit_vec(a, b, 7)"
    ]
@@ -1981,7 +564,7 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "## Cython in production code"
+    "## More cython"
    ]
   },
   {
@@ -1997,6 +580,7 @@
    "source": [
     "# Steps to optimizing code:\n",
     "- Profile where the bottleneck is (%prun)\n",
+    "  - You can install a [line profiler](https://github.com/rkern/line_profiler) (available as %lprun after installation)\n",
     "- Is there a faster algorithm for the bottleneck?\n",
     "- If the bottleneck is vectorized: can we optimize with numexpr?\n",
     "- If the internal part of the loop can not be vectorized:\n",
-- 
GitLab