{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sebastian Raschka \n", "last updated: 2016-05-31 \n", "\n", "CPython 3.5.1\n", "IPython 4.2.0\n" ] } ], "source": [ "%load_ext watermark\n", "%watermark -a 'Sebastian Raschka' -u -d -v" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Finding the Maximum Pairwise Product" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Our task is to simply fine the largest product between 2 different numbers in an array. For example, given the array\n", "\n", "a = [7, 1, 2, 8, 1, 3],\n", "\n", "the maximum product between a pair of numbers would be 7*8 = 56.\n", "For simplicity, we will only consider arrays consisting of positive numbers; however, the same concepts applies to negative valued arrays. Also, to keep the code simple, we assume that the array consists of at least 2 numbers." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First, let us create 2 arrays, a small and a large one that we will use for testing later." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import random\n", "\n", "random.seed(1)\n", "\n", "a = [7, 1, 2, 8, 1, 3]\n", "rnd_lst = random.sample(range(0, 10000000), 1000)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The probably simplest implementation may be to compute the product of each pair in this list while keeping track of the largest product as we traverse through the list.\n", "Here, we need to use two-nested for-loops. The outer for-loop traverses through the list indexes {*i ,..., n*}, and the inner loop traverses through the list indeces {*i+1, ..., n*}. Thus, we have an algorithm with quadratic complexity, $O(n^2)$." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "56\n", "99739554693120\n" ] } ], "source": [ "import sys\n", "\n", "def max_pairprod_1(ary):\n", " n = len(ary)\n", " max_prod = -sys.float_info.max\n", " \n", " for i in range(0, n):\n", " for j in range(i + 1, n):\n", " prod = ary[i] * ary[j]\n", " if prod > max_prod:\n", " max_prod = prod\n", " \n", " return max_prod\n", "\n", "print(max_pairprod_1(ary=a))\n", "print(max_pairprod_1(ary=rnd_lst))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, let's think about improving this solution in terms of computational efficiency. One solution would be to sort the list so that we just need to return the first (or last) 2 numbers and compute their product. This would be a substantial improvement over our previous solution, since efficient sorting algorithms have a time complexity of $O(n\\;log(n))$. However, we can do better ...\n", "\n", "If our array consists of positive numbers only, we just need to traverse through the array once and keep track of the 2 largest numbers in the array. (If the array contains negative values as well, we also want to track the 2 most negative numbers, since their product will be positive number as well.)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "56\n", "99739554693120\n" ] } ], "source": [ "import sys\n", "\n", "def max_pairprod_2(ary):\n", " pos_1 = -sys.float_info.max\n", " pos_2 = -sys.float_info.max\n", " \n", " for i in range(0, len(ary)):\n", " if ary[i] > pos_1:\n", " tmp = pos_1\n", " pos_1 = ary[i]\n", " if tmp > pos_2:\n", " pos_2 = tmp\n", " elif ary[i] > pos_2:\n", " pos_2 = ary[i]\n", "\n", " return pos_1 * pos_2\n", "\n", "print(max_pairprod_2(ary=a))\n", "print(max_pairprod_2(ary=rnd_lst))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Although our second implementation contains more if-else statements, which may come with some additional overhead, we now find the maximum pairwise product in linear time, $O(n)$, which is a big improvement over our previous $O(n^2)$ algorithm. Let's do a quick benchmark using the `%timeit` magic:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1000 loops, best of 3: 98.2 ms per loop\n" ] } ], "source": [ "%timeit -n 1000 -r 3 max_pairprod_1(ary=rnd_lst)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1000 loops, best of 3: 199 µs per loop\n" ] } ], "source": [ "%timeit -n 1000 -r 3 max_pairprod_2(ary=rnd_lst) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, to get a better sence of the **order of the function**, big O, let us repeat the benchmark for different array sizes:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import timeit\n", "\n", "funcs = ['max_pairprod_1', 'max_pairprod_2']\n", "orders_n = [10**n for n in range(1, 5)]\n", "times_n = {f:[] for f in funcs}\n", "\n", "for n in orders_n:\n", " rnd_lst = random.sample(range(0, 10**6), n)\n", " for f in funcs:\n", " times_n[f].append(min(timeit.Timer('%s(rnd_lst)' % f, \n", " 'from __main__ import %s, rnd_lst' % f)\n", " .repeat(repeat=3, number=5)))" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "\n", "def plot_timing():\n", "\n", " labels = [('max_pairprod_1', 'max_pairprod_1'), \n", " ('max_pairprod_2', 'max_pairprod_2')]\n", "\n", " plt.rcParams.update({'font.size': 12})\n", "\n", " fig = plt.figure(figsize=(10, 8))\n", " for lb in labels:\n", " plt.plot(orders_n, times_n[lb[0]], \n", " alpha=0.5, label=lb[1], marker='o', lw=3)\n", " plt.xlabel('sample size n')\n", " plt.ylabel('time per computation in milliseconds [ms]')\n", " plt.legend(loc=2)\n", " plt.ylim([-1, 60])\n", " plt.grid()\n", " plt.show()" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnQAAAH2CAYAAAD5+RGBAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xl8VNX9//HXSUJCEhMTCYKyBJBFFiG4ICpIEBUUUERR\nbBFBQen369faWrW2pXUp1Pq1Sqn9iYoLyGJlB0GloJGtCuo3qSxlkVVQSCCASAghOb8/bpKZhIRM\nQma5k/fz8ZgHc8/M3PmED+iHcz73XGOtRURERETcKyLYAYiIiIjI2VFBJyIiIuJyKuhEREREXE4F\nnYiIiIjLqaATERERcTkVdCIiIiIup4JORERExOUCXtAZY4YaYzYaY44ZY7YaY64pHu9jjNlUPL7c\nGNM80LGJiIiIuFFACzpjzA3An4B7rbXnANcC240xDYA5wG+B84AvgX8EMjYRERERtzKBvFOEMWY1\nMNla+1a58dE4RV6P4uM4IAdIs9ZuCViAIiIiIi4UsBk6Y0wEcDlwfvFS625jzERjTH2gI5BV8l5r\n7XFgW/G4iIiIiJxBVAC/qxFQD7gduAY4BSwEfgecAxwo9/6jQEIA4xMRERFxpUAWdHnFv0601h4A\nMMa8iFPQfQoklnv/ucAP5U9ijAncGrGIiIjIWbLWGn9/R8AKOmvtYWPMt+WHix8bgBElg8aYeOCi\n4vGKzuWnKMXfnnrqKZ566qlghyE1pPy5l3Lnbsqfexnj91oOCPy2JW8B/2OMaWiMSQZ+ASwC5gMd\njTG3GWNigD8AmbogIvzs3Lkz2CHIWVD+3Eu5czflT6oS6ILuWeALYAvO7NuXwHhrbQ5Ob9144BDO\nxRNDAxybiIiIiCsFsocOa+0p4L+LH+Vf+xhoH8h4JPBGjBgR7BDkLCh/7qXcuZvyJ1UJ6D50tcEY\nY90Ws4iIiNRNxpiAXBShe7lKQGVkZAQ7BDkLyp97KXfupvxJVVTQiYiIiLhc2C25tmjRgl27dgUw\nIhHfpKam6ko1EZE6JlBLrmFX0BX/xgUwIhHf6M+miEjdox46EQk56uNxL+XO3ZQ/qYoKOhERERGX\n05KrSIDoz6aISN2jJVcRERER8YkKOgmIp59+mrZt2wY7jAr17t2bBx54INhhuIL6eNxLuXM35U+q\nooJOAuKxxx7js88+C3YYZ23jxo3ceeedtG3blsjISBWCIiISEgJ6L9dQkJt7mMWLM8nJsaSkGPr3\nTyM5OSlkzheu4uLiiIuLq/R1ay3WWiIiqv9vjFOnThEVFZg/ysePHyc1NZVbb72VF198MSDfGUrS\n09ODHYLUkHLnbsqfVKVOzdDl5h7m+efXsnnz1Rw+3JvNm6/m+efXkpt7OCTO17t3b0aNGsXYsWNp\n1KgRycnJjB07FmstzzzzDI0bN+b888/nd7/7XelnZs6cSffu3UlKSqJhw4YMGDCArVu3lr4+a9Ys\nYmJi+OKLL0rHpk6dSlxcHOvXr68ypilTplCvXj2WL19Op06diI2NpXv37mRlZZW+5/Dhw9xzzz2k\npqYSFxfHxRdffFqx8/TTT9OmTZvTjt977z3at29PTEwMW7duZeTIkdxwww1MmDCBpk2bEh8fz513\n3klubm7pZ0ve8/LLL9OyZUvq169Pfn4+p06d4te//jVNmzYlJiaGjh07MnPmzDJx7N69m379+hEX\nF0dqaiovv/yyD5nxuPzyy/nf//1ffvrTn5KYmFitz4qIiPhLnZqhW7w4k6iodFaujC4eiaaoKJ37\n7ltDly7p1T5fVlYmBw+mExHhOV/PnuksXryGYcOqfz6AOXPmMGbMGFavXs2qVau47777+PLLL+nc\nuTOrVq1izZo1jBgxgp49e9K3b19OnjzJ2LFj6dixI0eOHOEPf/gD/fv3Z+PGjURFRTFkyBCWLVvG\n0KFDyczMZN++fTz00EO89NJLdOrUyaeYioqKeOKJJ5g0aRJJSUk8+eSTDBgwgG3bthETE0N+fj6X\nXHIJv/rVr0hKSmL16tWMGTOGBg0acO+995aex5iyF/ns27ePV155halTp5KcnEzjxo0BWLt2LfHx\n8SxdupScnBxGjRrFqFGjmDNnTuln165dS2JiIgsXLiQiIoJ69erxxBNP8Pbbb/Pqq6/SuXNnZs2a\nxbBhw2jcuDG9e/cGYNCgQdSrV48VK1YQHR3Nr371K7766qsyxaZULiMjQzMFLqXcuZvyJ1WpUwVd\nTo4lMjK6zFhERDR5eTXbSiIvz3oVc47IyGhycmq+NUXLli3505/+BEDr1q154YUX2Lt3L0uWLCkd\ne/HFF1m+fDl9+/YtUzABvPnmm6SkpLBu3TquuuoqACZMmEC3bt24//772bp1KzfeeCMPPvhgteJ6\n4YUX6NGjBwDvvPMOzZo1Y8aMGYwcOZJGjRrx+OOPl743NTWVtWvXMmPGjNPi85afn8+0adNo0qRJ\nmXFrLdOmTeOcc84B4O9//zt9+/Zl+/bttGrVCoDIyEimTZtGbGwsAHl5efztb3/jr3/9K4MHDwbg\nySefZN26dYwbN47evXuzbNkysrKy2LJlCxdddBEAM2bMoHnz5tX6vRAREQk1dWrJNSXFUFh4ssxY\nUdFJYmNrtj1MbKyhqKjs+QoLT5KSUvPtZrp06VLmuHHjxnTu3Pm0sQMHDgCQmZnJ4MGDadWqFYmJ\niaSmpmKMKXM/29jYWN59913mzp1LdnY2kydPrnZc3bt3L32elJRE+/bt2bBhA+AUYM899xxdu3al\nYcOGJCQkMGnSpCrvqduoUaPTijmADh06lBZzANdccw3gXJBQon379qXFHMC2bdsoKCigZ8+eZc7V\nq1ev0jg3bdpESkpKaTEHkJKSQrt27ar8+cWhGQL3Uu7cTfmTqtSpGbr+/dPYsCGDnj3TiYyMprDw\nJKdOZfD4491ITq7++XJz03j++Qyiosqer3//bjWOsV69emWOjTEVjhUVFZGXl0ffvn3p2bMnb7/9\nNo0aNQKcgujkybKF5sqVKwE4cuQI2dnZJCXV3oUbL7zwAn/+85+ZMGECaWlpJCQk8OKLL5bOKlYm\nPj6+xt9Z0We1aa+IiNRVdWqGLjk5iccf70a7dmtISvqEdu3WFBdzNStuavt81bVp0yays7MZN24c\n1157Le3atePgwYOnFTbr16/n0Ucf5Y033uD666/nrrvuoqCgoFrf5b3lyOHDh9m0aRMdO3YEnGKx\nX79+3HvvvXTp0oVWrVqxZcuWs/q5jh07Vnq8evVqjDF06NCh0s+0bt2amJgYVqxYUWY8IyOjtFew\nQ4cO5OTk8M0335S+npOTw+bNm2sca12jvbDcS7lzN+VPqlKnZujAKcJqesFCIM5XHampqcTExDBx\n4kQeffRRduzYwZNPPllm648TJ05w9913M3jwYIYPH87AgQNJS0vjscceY8KECT5/1+OPP85f/vIX\nkpKS+O1vf0tiYiJ33303AO3atWPatGlkZGTQpEkTpk6dytq1aznvvPNq9HMZYxg+fDjPPvssBw8e\n5KGHHuLWW28t7Z+rSGxsLA8//DBjx44lJSWFLl26MGvWLBYtWsSyZcsA6NOnD507d2bYsGFMnDiR\nevXq8etf/5ro6OhKz1teQUEBGzduxFrLsWPHOHToEFlZWURHR9O+ffsa/bwiIiJnq84VdKGs/FWg\nVWnQoAHTp0/nySef5K233qJ9+/ZMmDCBPn36lJ7rl7/8JSdOnOCVV14BIDk5menTp9OnTx/69u3L\nTTfdVOX3REZGMn78eB588EF27NhBWloaS5YsoX79+gCMHTuWPXv2lF5BOnToUH7+85/zzjvvVPN3\nwNGtWzd69OjBDTfcwNGjR7n55pt59dVXq/zcuHHjiIyM5Be/+AXZ2dm0bt2a6dOnl+k9WbBgAQ88\n8AC9evUiJSWFxx577LTl6TPZt28fXbt2Lf39/eqrr5g3bx6pqals37692j+r26iPx72UO3dT/qQq\nxm19R8YYe6aYdQP02jVlyhRGjx5draLnbIwcOZK9e/eydOnSgHxfIOnPpohI3VP83/6aXy3pozrV\nQyciZ0d9PO6l3Lmb8idVUUFXxyUkJJCYmEhCQkKZR2JiIs8991ywwwuoVatWnfH3Y/Xq1cEOUURE\npEJacq3jztT3dd5559Xq9iahLj8/n71791b6epMmTYiJianx+fVnU0Sk7gnUkqsKOpEA0Z9NEZG6\nRz10IhJy1MfjXsqduyl/UhUVdCIiIiIupyVXkQDRn00RkbpHS64iIiIi4hMVdCLiM/XxuJdy527K\nn1RFBZ0ExNNPP03btm2DHUaFevfuzQMPPBDsMERERGpMBZ0ExGOPPcZnn30W7DDO2ltvvcV1111H\nw4YNSUxM5PLLL2fGjBnBDitgdD9J91Lu3E35k6qooJOAiIuL47zzzqv0dWstRUVFNTr3qVOnahpW\ntX3yyScMGjSIDz/8kKysLH7yk58wfPhwZs2aFbAYREREyqtzBV1ubi7TFkxjwswJTFswjdzc3JA5\nX+/evRk1ahRjx46lUaNGJCcnM3bsWKy1PPPMMzRu3Jjzzz+f3/3ud6WfmTlzJt27dycpKYmGDRsy\nYMAAtm7dWvr6rFmziImJ4Ysvvigdmzp1KnFxcaxfv77KmKZMmUK9evVYvnw5nTp1IjY2lu7du5OV\nlVX6nsOHD3PPPfeQmppKXFwcF198MS+++GKZ8zz99NO0adPmtOP33nuP9u3bExMTw9atWxk5ciQ3\n3HADEyZMoGnTpsTHx3PnnXeW+X0tec/LL79My5YtqV+/Pvn5+Zw6dYpf//rXNG3alJiYGDp27MjM\nmTPLxLF792769etHXFwcqampvPzyyz5kxmPq1Kk8/PDDXHbZZbRs2ZJf/vKX9O/fn/fee69a53Er\n9fG4l3LnbsqfVKVOFXS5ubk8/97zbI7bzOELDrM5bjPPv/d8jYuw2j4fwJw5czh16hSrV6/mpZde\nYty4cfTv35/jx4+zatUqXnjhBcaPH89HH30EwMmTJxk7diyZmZksW7aMqKgo+vfvXzprNWTIEEaM\nGMHQoUM5duwYW7Zs4aGHHuKll16iU6dOPsVUVFTEE088waRJk1i3bl1p4Zifnw84t8y65JJLWLhw\nIZs2beL3v/89Tz31FFOmTClzHmPKXrW9b98+XnnlFaZOncrGjRtp0qQJAGvXriUjI4OlS5fywQcf\nkJmZyahRo8p8du3atXzyyScsXLiQrKws6tWrx5NPPskbb7zBxIkT2bBhA8OGDWPYsGF88sknpZ8b\nNGgQubm5rFixgkWLFrFw4UK++uqramTodIcPHyY+Pv6sziEiInI26tQ+dNMWTGNz3GZW7l1ZOlZ0\nqogGOQ3o0r1LtWPJ+iyLgykHiYjy1MU9m/Sk3fF2DLt1WLXP17t3b44cOVKmwOjUqRORkZFlZsTS\n0tK48cYbef755087x6FDh0hJSWH16tVcddVVAOTl5dGtWzc6dOjA1q1badWqFbNnz/YppilTpnDf\nffexfPny0h6Ow4cP06xZMyZOnMjIkSMr/NwjjzzCpk2bSgvPp59+munTp7Nly5bS42effZZdu3aV\nFnLgzL7NmTOHffv2cc455wDwz3/+k759+7Jt2zZatWrFyJEjWbBgAXv37iU2Nrb0Z0xOTuavf/0r\nDz74YOn5Bg8ezNGjR1m2bBnLli2jb9++bNmyhYsuugiAnJwcmjdvzrBhw3jttdd8+j3xNm3aNEaN\nGsXnn39Oly5n/jOkfehEROoe7UPnBznHc4isF1lmLCIqgryCvBqdL68gr0wxBxBZL5Kc4zk1jrF8\nUdC4cWM6d+582tiBAwcAyMzMZPDgwbRq1YrExERSU1MxxrBr167S98fGxvLuu+8yd+5csrOzmTx5\ncrXj6t69e+nzpKQk2rdvz4YNGwCn/+25556ja9euNGzYkISEBCZNmlQmhoo0atSoTDFXokOHDqXF\nHMA111wDwMaNG0vH2rdvX1rMAWzbto2CggJ69uxZ5ly9evUqjXPTpk2kpKSUFnMAKSkptGvXrsqf\nvyILFizggQce4M0336yymBMREfGnOlXQpcSlUFhQWGas6FQRsfViK/nEmcXWi6XoVNlG/sKCQlLi\nUmocY7169cocG2MqHCsqKiIvL4++ffsSERHB22+/zbp160p75U6ePFnmMytXOrOSR44cITs7u8bx\nVeSFF17gz3/+M4888gjLli0jKyuLUaNGnRZDeWezTFnRZwM5+/Xuu+8ydOhQJk+ezE9+8pOAfW+w\nqY/HvZQ7d1P+pCpRwQ4gkPpf258N722gZ6ueRNaLpLCgkFPbT/H4g4+TnJxc7fPldnF66KJSo8qc\nr/+d/f0Q/ek2bdpEdnY248aNK51lWrNmzWmFzfr163n00Ud54403mD9/PnfddReff/75aYXimXz2\n2Wdlllw3bdrEz372M8ApFvv168e9995b+v6SpdWa/lzHjh0rnaVbvXo1xhg6dOhQ6Wdat25NTEwM\nK1asKPO+jIyM0l7BDh06kJOTwzfffFNmyXXz5s1cccUVPsf3+uuv8/Of/5x33nmHO+64oyY/ooiI\nSK2qUzN0ycnJPH7n47Q73o6k75Jod7wdj99Zs2LOH+errtTUVGJiYpg4cSLbt29n+fLlPPLII0RE\neNJ64sQJ7r77bgYPHszw4cN54403OHjwII899li1vuvxxx9n5cqVfP311wwfPpzExETuvvtuANq1\na0dGRgYZGRls3bqVsWPHsnbt2hr/XMYYhg8fzoYNG1ixYgUPPfQQt956K61atar0M7GxsTz88MOM\nHTuW2bNns3XrVsaPH8+iRYv47W9/C0CfPn3o3Lkzw4YNY926dWRmZjJs2DCio6N9ju2ll17iv/7r\nv/jrX/9Kz5492b9/P/v37z/rq6XdQnthuZdy527Kn1SlTs3QgVOE1eSChUCcr/xVoFVp0KAB06dP\n58knn+Stt96iffv2TJgwgT59+pSe65e//CUnTpzglVdeKY13+vTp9OnTh759+3LTTTdV+T2RkZGM\nHz+eBx98kB07dpCWlsaSJUuoX78+AGPHjmXPnj0MGjSIevXqMXTo0NIZrJro1q0bPXr04IYbbuDo\n0aPcfPPNvPrqq1V+bty4cURGRvKLX/yC7OxsWrduzfTp08v8h7Ck761Xr16kpKTw2GOPVbk07G3i\nxIkUFRUxZswYxowZUzreq1cvPv7442r9nCIiIrWlTl3lKtU3ZcoURo8eXa2i52yMHDmSvXv3snTp\n0oB8XyCFw5/NjIwMzRS4lHLnbsqfe+kqVxERERHxiQq6Oi4hIYHExEQSEhLKPBITE3nuueeCHV5A\nrVq16oy/H6tXrw52iEGnGQL3Uu7cTfmTqmjJtY7bvn17pa+dd955JCUlBTCa4MrPz2fv3r2Vvt6k\nSRNiYmJqfH792RQRqXsCteSqgk4kQMLhz6b6eNxLuXM35c+91EMnIiIiIj7RDJ1IgOjPpohI3aMZ\nOhERERHxiQo6EfGZ7ifpXsqduyl/UpWwu1NEampqte+4IBIIqampwQ5BRETCVNj10ImIiIiECvXQ\niYiIiIhPVNBJQKkPxN2UP/dS7txN+ZOqqKATERERcTn10ImIiIj4iXroRERERMQnKugkoNQH4m7K\nn3spd+6m/LlPbu5hpk3LCNj3hd0+dCIiIiLBlJt7mOefX0tBQXrAvlM9dCIiIiK1aNq0DFauvJpt\n26L5+OPA9NBphk5ERESklhQUQEaGZdu26IB+r3roJKDUB+Juyp97KXfupvy5w4ED8PrrcPCgoajo\nZEC/WwWdiIiIyFmwFr76yinmDhyAtm3TKCrKICUlcEVdQHvojDEZwJVAAWCAb6217Ytf6wO8DDQD\nPgdGWmt3V3AO9dCJiIhISMjPh/ffh6+/9ozVqwfXXHOYPXsyGT68d0B66AJd0H0CTLXWvlVuvAHw\nDXAf8D7wR6CntfaqCs6hgk5ERESCbt8+mD0bDh3yjDVsCEOGwPnnO8fhvLFwRT/UYGC9tXautfYk\n8BTQxRjTNqCRid+pD8TdlD/3Uu7cTfkLLdbC55/DG2+ULeYuvRQeeMBTzAVSMAq6PxljDhhjVhpj\nehWPdQSySt5grT0ObCseFxEREQkJeXnwj3/ABx9AYaEzFhMDt98Ot9ziLLcGQ6CXXK8ANgIngbuB\nvwFpwG+BA9ba33i9dxXwmrV2arlzaMlVREREAm73bpgzB44c8YxdcIGzxHreeRV/JlBLrgHdh85a\nu87rcKoxZijQHzgGJJZ7+7nAD4GKTURERKQi1sKqVfDJJ1BU5Bnv3h2uvx6iQmBX3xAIAYANwL0l\nB8aYeOCi4vHTjBgxghYtWgCQlJREWloa6enpgKfPQMeheTxhwgTly8XHyp97j0ueh0o8Olb+3HJ8\n+eXpzJsHy5c7xy1apBMbCxdckEH9+hAVVfb9Jc937txJIAVsydUYcy7OliWfAqeAocAknCXXI8BW\nnKtclwDPAj2stVdXcB4tubpYRkZG6V8WcR/lz72UO3dT/oJj+3aYOxeOHfOMNW/u9Mude65v5wjU\nkmsgC7oUnGKtHVAI/Af4nbX24+LXrwP+DjTH2YduhPahExERkUArKoKMDFi50lluBTAGevSA3r0h\nIsL3c4VdQVdbVNCJiIiIvxw54lz4sNtrSumcc+C22+Cii6p/vnDeh07qMO8eA3Ef5c+9lDt3U/4C\nY/NmmDSpbDHXqhWMGVOzYi6QQuWiCBEREZGgOHUKli2Dzz7zjEVEOMurPXo4y62hTkuuIiIiUmcd\nOuTcvmvfPs/Yuec6Fz40b3725w/LfehEREREQsX69bBoEeTne8batYNBgyA2Nnhx1YR66CSg1Afi\nbsqfeyl37qb81a6CAli40JmZKynmIiOhXz8YOtR9xRxohk5ERETqkOxsmDULDhzwjJ13HtxxB1x4\nYfDiOlvqoRMREZGwZy383//BBx84M3QlOnWCgQMhJsY/36seOhEREZFakJ8P778PX3/tGatXD266\nCbp2dcdVrFVRD50ElPpA3E35cy/lzt2Uv5r77jt49dWyxVzDhjB6NFx6aXgUc6AZOhEREQlD1sLa\ntbB0KRQWesYvvdSZmatXL3ix+YN66ERERCSs5OXBggXwn/94xqKjnV65Sy4JbCzqoRMRERGppj17\nnO1IjhzxjF1wAQwZ4lzNGq7UQycBpT4Qd1P+3Eu5czflr2rWwsqV8NZbZYu5K6+E++8P72IONEMn\nIiIiLnfsGMybB9984xmLjYVbb4WLLw5eXIGkHjoRERFxre3bYe5cp6gr0ayZs1HwuecGL64S6qET\nERERqURREWRkOMusJfM8xkCPHpCe7tzKqy5RD50ElPpA3E35cy/lzt2Uv7KOHIG334YVKzzFXHw8\nDBsGffrUvWIONEMnIiIiLrJ5M8yf72xNUqJVKxg8GM45J3hxBZt66ERERCTknToFy5bBZ595xiIi\noHdvuOYa53koUg+diIiICHDokLO33L59nrHEROfCh+bNgxdXKKm0oDPGTPXxHPnW2tG1FI+EuYyM\nDNLT04MdhtSQ8udeyp271eX8rV8PixZBfr5nrF07Z0uSuLjgxRVqzjRDdxcw3odzPAqooBMREZFa\nU1AAH34IX37pGYuMhBtucDYLNn5fxHSXSnvojDHbrLWtqzyBMf+x1gZs2z710ImIiIS37GyYNQsO\nHPCMnXees8R64YXBi6smAtVDp4siREREJCRYC5mZsGSJM0NXolMnGDgQYmKCF1tNBaqgq9E1IcaY\n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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_timing()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.1" } }, "nbformat": 4, "nbformat_minor": 0 }