{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Computação vetorizada com NumPy\n", "\n", "## Contexto: \"O incrível crescimento de Python\"\n", "\n", "\n", "\n", "\n", "\n", "Fonte: StackOverflow blog [The Incredible Growth of Python](https://stackoverflow.blog/2017/09/06/incredible-growth-python/)\n", "\n", "\n", "\n", "Fonte: StackOverflow blog [Why is Python Growing So Quickly?](https://stackoverflow.blog/2017/09/14/python-growing-quickly/)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exemplo 1: MRUV\n", "\n", "> Exemplo do livro *Programming for Computations - Python: A Gentle Introduction to Numerical Simulations with Python* de Svein Linge e Hans Petter Langtangen.\n", "\n", "Altura ao longo do tempo de um objeto lançado verticalmente:\n", "\n", "$$y = {v_0}t + \\frac{g{t^2}}{2}$$" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "v0 = 5\n", "g = -9.81\n", "t = np.linspace(0, 1, 1001)\n", "\n", "y = v0 * t + g * t**2 / 2\n", "\n", "plt.plot(t, y)\n", "plt.xlabel('t (s)')\n", "plt.ylabel('y (m)')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exemplo 2: Random Walk\n", "\n", "Exemplo adaptado de Nicolas P. Rougier em [From Python to Numpy](http://www.labri.fr/perso/nrougier/from-python-to-numpy/)\n", "\n", "### Random walk: solução OO" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import random\n", "\n", "class RandomWalker:\n", " \n", " def __init__(self):\n", " self.position = 0\n", " self.path = []\n", "\n", " def step(self):\n", " self.position += random.choice([-1, 1])\n", " self.path.append(self.position)\n", " \n", " def walk(self, steps):\n", " for _ in range(steps):\n", " self.step()\n", " return self.path" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[1, 0, 1, 0, 1, 2, 3, 2, 1, 0]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "walker = RandomWalker()\n", "walker.walk(10)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "walker = RandomWalker()\n", "plt.plot(walker.walk(1000))\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1000 loops, best of 3: 1.68 ms per loop\n" ] } ], "source": [ "%%timeit -n 1000\n", "walker.walk(1000)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Random Walk: solução procedural" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def random_walk(n):\n", " position = 0\n", " walk = [position]\n", " for i in range(n):\n", " position += random.choice([-1, 1])\n", " walk.append(position)\n", " return walk" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1000 loops, best of 3: 1.29 ms per loop\n" ] } ], "source": [ "%%timeit -n 1000\n", "walk = random_walk(1000)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Random Walk: solução vetorizada com `itertools`" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from itertools import accumulate\n", "g = accumulate([1,2,3,4,5])\n", "g" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(1, 3, 6)" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "next(g), next(g), next(g)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[10, 15]" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "list(g)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[1, 3, 6, 10, 15]" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g = accumulate([1,2,3,4,5])\n", "list(g)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def random_walk_itertools(n):\n", " steps = random.choices([-1, 1], k=n) # choice plural, Py ≥ 3.6\n", " return [0]+list(accumulate(steps))" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1000 loops, best of 3: 322 µs per loop\n" ] } ], "source": [ "%%timeit -n 1000\n", "walk = random_walk_itertools(1000)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Random Walk: solução vetorizada com NumPy" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 1, 1, -1, 1, -1, -1, 1, 1, 1, 1])" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import numpy as np\n", "np.random.choice([-1, 1], 10)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def random_walk_numpy(n):\n", " steps = np.random.choice([-1, 1], n) # choice singular!\n", " return np.cumsum(steps)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1000 loops, best of 3: 27.7 µs per loop\n" ] } ], "source": [ "%%timeit -n 1000\n", "walk = random_walk_numpy(1000)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD8CAYAAABn919SAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJztnXmcU9X5/z8n20wySzIDM+wwIAiyLyPiLoqiaMXa1qp1\n19p+a3/V2tZird+6tGrtYr+tba1LBVdsLSotdQGKUhAREBCQHYZ9mQGSmSGZyU1yfn/cJffe3Cwz\n2W+e9+s1r9yce5OcczP53Oc+5znPwzjnIAiCIIofS747QBAEQWQGEnSCIAiTQIJOEARhEkjQCYIg\nTAIJOkEQhEkgQScIgjAJJOgEQRAmgQSdIAjCJJCgEwRBmARbLj+sZ8+evKGhIZcfSRAEUfSsWbOm\nhXNel+y4nAp6Q0MDVq9encuPJAiCKHoYY3tSOY5cLgRBECaBBJ0gCMIkkKATBEGYBBJ0giAIk0CC\nThAEYRJI0AmCIEwCCTpBEIRJIEEnCKIgeWfdAfgCQr67UVSQoBMEUXAc9AZw99x1mL/uQL67UlSk\nLOiMMStjbC1j7F/S81rG2ELG2HbpsSZ73SQIopQ4fjIoPZKF3hW6YqHfDWCz6vksAIs558MALJae\nEwRBpI3savEGgnnuSXGRkqAzxvoDuBzA86rmmQDmSNtzAFyV2a4RBFGqyIJeiD70UDgCznm+u2FI\nqhb67wDcByCiauvFOT8kbR8G0CuTHSMIonTx+iVB9xeWoIfCEQx94F08+f7WfHfFkKSCzhi7AsBR\nzvmaeMdw8XJleMlijN3JGFvNGFvd3Nzc/Z4SBFEyyK4Wb4FZ6K0dIQDAC//dneeeGJOKhX42gCsZ\nY00A5gK4kDH2CoAjjLE+ACA9HjV6Mef8Wc55I+e8sa4uaTpfgiAIxTIvNJeL11/YPv2kgs45v59z\n3p9z3gDgWgD/4ZzfAGA+gJulw24G8E7WekkQREmhTIoWmMul0O4Y9KQTh/4EgIsZY9sBTJOeEwRB\npEyHEMZP3tqAY+2dmnbFhx4IFsQE5N9W78PYh97HtsNtAIBgOIIN+32Y/ItFeHbpTgAA5xy/fn8r\nNh7w5a2fXapYxDn/EMCH0vYxABdlvksEQZQK//r8EF5buRecA49fPUZpl33oQpjDHwyjoiynxdVi\nuO/NzwEAs+ZtUNq+9PQyAMBj/96CO887BQEhjKeX7ECYc4zu585LP2mlKEEQeSMcEQPnhHBE0652\ntRSaHz0ecp/z6SYiQScIouBoDQiokqzyQvOjGxEKR5QLT2seL0Ak6ARB5I2TnWEAwIb9PnQIYWw5\n3ApAnHwc2MMlbec+suRoawcOegMAgHAkuQ+/tSMUtdDzuLqVBJ0giLwhR41sPdKGO19egyv/sBwn\nTgbhD4YxSBL0fCwueuDtjbjnjXUAgLaO5J/v9Qfhk2Pn83hHkd+ZBoIgShqfKq57xc4WCGGO3cdO\nAgAG9agQj8mDC+OwrwOtHcY+8VF9q2G3WrBun1dp8wYE8qETBFHaqMVaCIuujb3H/ACABsXlknuB\n9AWEuPlkPC47+tc44x5PPnSCIEoSI7Fukiz03m4n7FaWF4tXdKEIiES40kfZBeRxOuBx2TVtPr+g\nHNfWGYqJ2skVJOgEkQLtnSE0zFqAhlkL8IfF2/PdHdNgJNa/WySeX4/TDrfTkXOXSzjC0doRAudA\nW0dIWe4vu4DcLjs8ToemzesPasaSLyudBJ0gUmCrtEIQAH6zcFsee2IufAEBI3pXGe7zuOzwuOzK\nZGOuUIuxNxBULigNioVuVyz0gbVO6ThB0898pQggQSeIFIgUwPJzM+ILCGhsqFFcF2rcTjs8TnvO\nXS7qOwJfQFCibAbWupR+VTtFQa+tKENVmU3jQ9e/Ry4hQSeIFMjnRJdZiUQ4vP6g6JOWBFJNVbkd\n7jwIutq69kq+8QqHFT0rywBIdw5Sfz1OO9wuu+hD9wvoWSm6YvKVx53CFgkiBfSi8vbaAxhQ68TI\nPm68uWYfvnHGIFgsLE+9KzyEcASvrdyLijIbLAxYsfMYzjylB05vqEWEc2w+1IqzhvZEhIsCWW0g\n6FYLg9tlxxaVuyubcM7x+Ltb8PKKPUrb0bZOvLBsN3pXl8MtuVncTgc8LlG4ZbeQHLY4sNaFlvYg\nXlrRhKkj6nPSbzUk6ASRAnqfqLzo5I5zBuP5ZbvRq7ocl4zqnY+uFSSvrdyLn83fpGn7+5r9qKsq\nw5fG9sUrn+zB4h+cD0ByrUgCqceTw0nR5TuO4dmluzRtv3p/CwDgcGsHTutdjVPqKjCqbzUqymwY\nVl+Jsf3d8DgdSlTM5MG1+GyvF0u2NiMQDMPpsOak7zLkciGIFPD5g2AMuPnMQZr2Zinta3tnKB/d\nKlhOxCkE0dzWCa8/iGA4oiytl33lav79vXMBiBZwe47CAI2+wyOt0bS+vd3lWPyDCzCg1oXaCgcW\n3ns+htZXwe2049jJINo7QxhQG50LyIcfnQSdIFLAFxBQXW4HY8ZuFZozTR35bmePtIDI43LArRN0\nj+LeEB9zMYehn/h22FKTR7fLjr3HxbH0qIjeaeQjpwsJOpF3wtLk2PGTQXSGwvnujiHegKCIjBo5\nuZRfEB855zips/T8wVBBFGnIJYmGK8d1b5YSccl+aDXyc/lRbSlnC33Olp4Vxm4gPR6nXRmvehyH\nfR3K+waCufm/JkEn8s4P/74e4x9ZiImPLsTwn76X7+4Y4vUL8DjtOLWXNmZ60eYjAKI5SZbtaMHE\nRxeiuU0UoJb2Toz83/fx3H+1vlmz4w/Gd0HJFvqLy5sAiIJYX10OIGrhOu2i71m20Gf8/r/Z6mq0\nX7qJ74OSIAPAhIGeuK9Ti7j6TuOWF1dh/wk/xjz0AU773/dyclEnQSfyzltrD+S7C0nxBgRUO+24\nbvIAlBncisv+0p1H29EZivqHZStt3meFP8ZMkijUUB/SV+20Y8bo3njrO2fhPz+8AO/fc57i2oo3\nWZoN5AvNL748Gv+RJmxl5tw2Oe7r1CLucTkw984pyvOdzSeV7YCQfSudolwIIgVaA2JIGmMMkwbV\n4OOdxzT7ozUwQ9Kj+LxQXUjZJtGEoH5fuWSNTxhYA0ArkOptznncOYxM4AuIceTfOGNQzL7q8lh3\nm4y+v0PrK5XnrbrFRi5HdiWXLHSi4IikUFAg14gLYOL/qGXrTp4IU54XQbWdbJBo6XuoC9+v+px3\nCNmNdPH5hZjJ2VQos0dDEz1OOypUoYr7TviV7Vz8L5CgEwVHewL/az74YNNhnPBHJ0VtVgOXi2yh\nS4/7T/jx/TfW4Y6XVueuo3ngNx9sxbLtLfjxm59jz7GoeyFTKyXVC46yHTXiDQQ1Lh67NbW7AYvq\nrqHaqY2E2tNCgk6UGFW6iu75WjYdjztfXgMgemv92JdH47xT65T91eU2xY0gW6Z/+WgX3lp7wNTh\njJxz/OE/O3DDCyvxxup9uO/Nz5V93kAQPSsduG7yQNx05iC8dNtkwyRc3zpvSMLPsFoYTqmTMxpm\n9//Cq7PQ3/z2WQCA2beenvB1Zw7pgWH1lbh6Yj9YpdXCl4zsBQDYczx6kSu3Z19uSdCJvBPmHHec\nMxjP3jgJQOFWeZetxf41Lvz5GxOV9stG94m6WqRoF/0YzJjcS78QRz1GX0DA1RP74/Grx+CRmeIF\n8IHLT4t5j2+ff0rSz3l05mjlPbOJLyBoXDzjBnjQ9MTluGB44iX8DpsFC+89H7+9ZrzS9qPpwwGI\nxTrK7RY0PXG5MkeQTUjQibzSGQrDHwxLscji7W6h+p3V0S0ulZ/U47KrJkWN+97WUVhupEwQ73vq\nEMLoECKxi4WcsRErRjlc9Mg5VLL9f+HzC8pnpYv8Pgd9HYbjzhYk6ERekQXQ7YpWgcln1fRUUftJ\n3S47OkMRdAjhuIJeqBepdNCPdVXTCUQiHBsP+AAgZrFQZXlshIc1hYRm8oU+m3nRhXAEbZ2hjImv\nNpQxMxeJVCBBJ/KK7C93O+3Kj6BQxW9U3+qYtgkDPYoIeP1C3L4HhLDpQhiNxvrSiiZ89ZkVAGIt\n8h6V0ecTEyzU0ZOL/ws5vDBT4ltmi97ByWkBcgHFoRN5RZ5E9KgEvZB86HJSqLumnoKh9dpJvW0/\nvwwWBry/SVwtesAbMAzJu/O8IXh26S74AgLqq3KbfS+bGH1P24+2K9t6l0t1uR1bHr0UAGC3WhBO\nMXyxwmGFzcKy+n+h3Cl2I2wxGZ2h3NUXJQudyCuyhe5x2VFut6LcbikoQZf70ktamq7GYbPAZrUo\nVt1eVUSDmqF14kKTQoveSZdkrjEja1f8jq2wWljKya8YY0rO8WzhVVx/mRf0agNXU7YgQSfyStRC\ndyiP3jipV/OB15/ccpP3ydkD9fR2ixeDfNWZzBZGLhC1zZ1Ja9fttGf1gqgYFlmw0FOZJ8gUJOhE\nl/jjkh1omLUADbMWKAmousKv3t+Ch1SFD2Txdquy6xWSD33abz8CkDiniGyJxhN0jypK465XP8O3\nXi7+xUZHWzvwq/e3xrSro3lSiWBJFbfTrtwRtHeGlP/BVN02yZDfOxu5Y9Q50rMN+dCJLqH+Ea/d\ne6LLVXpW7DymiV/2BQQwFl1cVO20F5TLRSYVC71JWin56h1nYP66gzh7WE+peIMcpSFgwYZD2e9s\nDli5+7iyfe3pA3DW0J743utrsV9a6n6uNPZM4XE5cLRNTHTW1BJ1bbV3hDLiJvGlcCfWVd69+1zM\nXt6EH0ox6bmABJ3IKd6AgPYOraC7nXalHqfHac9pVEAi1OlOE92KV5bZYLUw7JUs9CF1FfjlV8cq\n+5VVpAXkSsokT3xFHOsLy3Yr5+DGKbEJrtLB47Rj2xGxtmhQVb3IGwhmRNBld1gm/d2n9anW/B/k\nAnK5EN2moxuz9z6piroslnKecZlCcrmo050mCmdjjMEjlSEDYsP1qqRCyYV459FdjErCac5Bhl0X\nblfUh64+j5n6X/H6BVSV2wzz9BQTxd17Iq/8acmOLh3POYc3ICAYiuD3i3fAHwzBGxDgVv34PS5H\n3hYWHW3rwMsrmgCI1vRTC7cp+6oSpE8FonMADpslJmeHxcJQbrfiD/+Jnq9c1MjMJkYXJ/VFL9OL\naTxOB9o6Q3h5RRNufXGV0v7KJ3sy8v6+OBWpig0SdKLbbDncpvhMU+FkMKxMYj21aBv+b/F2+PzB\nmHzSHYK46jLXzF93EA++swlHWjvwwFsb8dx/dyv7kkUqyGPwOI3rjvp1JciK3VqX+3/PtGFKW7w8\n5pnA7RRdIQ++s0nT/vc1+zPy/rLrr9hJKuiMsXLG2KeMsfWMsU2MsYel9lrG2ELG2HbpMfuZZ4iC\noyu1EvU+ZNn94jEQglwUBdYj3757/QKa26MRPK9984ykr5XHkKooFIpbqbvILop7pp2qtBl9j5ki\nkQsnEytwxXz3ucu5ki1SsdA7AVzIOR8HYDyASxljUwDMArCYcz4MwGLpOWFijKzmrliaRiKmv9WN\n5nPJg6DrMiYqfUrhhy4LTqq37dnMS5ILjFwUsuus3G5RqhBliqoEk5WZuNsRXX8lYKFzEXk9r136\n4wBmApgjtc8BcFVWekgUDEaCvK8LLhf9D4/z2JSlsnjuO+7vVpx7OigWuq6fqYi0W7HQU7PysmGh\nB0MRtHUIOHEycxeL9s4QjrR2wOcXNDHfRhatR3E7Zd7StSRweSVacNQhhA3vIvXnyKebnC9WUvKh\nM8asjLF1AI4CWMg5XwmgF+dcDqo9DKBXlvpIFAhGltD331ifcjVz/eu9gSA41y5AkYXx9jmrcfov\nFmmq4GQbuX96gUjFfeBO4nLRF3fIhg/9ttmrMOahDzDh0YXYl6HQz9E/ex9nPLYY4x75AI//e7PS\nbuRzTnYO0qGPOzb1gkyiu7kf/n09/t/razVtmw+1YuLPF2LzoVYA4mR9yfjQAYBzHuacjwfQH8Bk\nxtho3X4O7apfBcbYnYyx1Yyx1c3NzWl3mMgfsivi51eNxtt3na206yf84r9e+8PbdzwAQOsf1VvD\nTXFWX2YDRdBVYZWANvd5PDyqla5G/O3bZ+LFW07Hczc1AsiOhb5sR4uynY1Y/nlrDyjbRi4KeezZ\ncF2M6F2NK8b2AQCc2qsSK+6/EH+SiowkstCbjp2MMQr2HPOD8+jK3pPBMEIRXnpRLpxzL4AlAC4F\ncIQx1gcApMejcV7zLOe8kXPeWFdXZ3QIUSTIltD4AR6M7eeOaU/+eu1triw6msk03Y8ql5V+oi6X\noGYJeyqV5hVBj2PlVZfbMXVEPS4cUQ/Gsj9HkIkl8aEEoZVGLopk5yBdxkj/c+cNq0MftxOj+4rP\nE51LrzTxrkaev/Dp5kxKYlKUMVbHGPNI204AFwPYAmA+gJulw24G8E62OkkUBurMiGqfZqorIH1+\nQVP1R04BoLaM9PVFc1npRx6H1y90OcpGSS6WxMqzWhiqy+3wZXnVaGtH+heM1jjnXl5PEDMpmuI5\nyBTRSkbxz6XPL8Dn195xqaOZ1I8lMSkKoA+AJYyxzwGsguhD/xeAJwBczBjbDmCa9JwwKaFwBPf9\nQywCrPc1/kwXGxyPeIs31O+nt4Z9AQHvbTykWeTTVV5cvhtzP92b8JhwhKNNusB4A7FWXTLkeYCU\nSqrlIF+N/v2XbDmKhlkL8PFO0S3zxLtbsGRL9Kb6nXUH0DBrATbs9+H9TYfRMGsBJj660PC95fUE\nufShA2IOdQCwS0ZBVZkNLMEK3JBUhSgYjuDW2auUXDDy8X9ZugsvLt+tXLxLwofOOf+ccz6Bcz6W\ncz6ac/6I1H6Mc34R53wY53wa5/x4svciipdtR6KFCyolK/qWsxoAAKv3nEjpPeSq6k9+dSwGqjLQ\nJbKMfP4gvv3KZ/i/xdu70WuRh//5BWbN25DwmLYOAbIR19zWCX8wjGH1lXj6+gkpfcaovtW46cxB\nOHdYcrditnN7A7E++ltni6srr39uJQDgmY92Km0AcPfcdQCA2+aswrdeXpPkvY1dFA6bBfdefCqu\nHNcvvc7H4drJA3DjlEFKYWmLhYlZGOP40NV3GB9ubcYfFosrdeVzf/xkEA//84toCucSsdAJAqFI\n1J8qW9HfOn+I0paKz9YbEEPdrmkcgK9N6q+0J7KM1D/WSIZSpSb7HDnB1E1nNeCKsX1Ten253YpH\nZo5GbUVyP2wiEeou+vOf6A4g3VW4iVwU37toGMb0d8e0ZwKXw4ZHrxqtrdeZ4G4nnitGP4kqj6ck\nfOgEAcTJ3aH6AaTic/aqqqrL1pDLYdXUX1RTXW7TWLLtwez509XZ9g63irfm2Zrc87gcGXe56M9/\nIr9yootJoolQQUrGJve9EOK23S5H3LudeO1G4bMAWehECbFkS2zIqToJlRzq9+HWo3Hj0ltVi4iq\nU/C39vU48aYqV4fasjrZGcIrn+zB65/uRSAYVnzDMst3tKAzFMbO5nakgvwjb+hZobRly6fqdtqw\nu+Uk5n2WmTwkgWAYH3xxWNOW6IKh3venD3codyQAcCKB2Ld1hrD3mD9af7MABFCsZBTEtiOxeYX0\n52Duqr3YfqQtJtqqpS0oJVUr/nqvJOhEUoRwBH9dLiaq6qFyKagnML0BAZ/uPo5bXlwV16fuVS3e\nkGPPjUTzqvGim6NJFz+s/oF+/411+OnbG3H/vA245i8rcP1zK3FUsqw3HfThG8+vxBPvbsFFv/lI\neU0iV4Ns0ap9+9my2OQ7m3v/tl4zMdld7p/3OX78D+0cQSIrXG29P/neVpz3qyUJ3/+MwbXK9nm/\nWlJQLgqPU5yPuOSppTjnl9px6F0rQpjj4qeWxpybvcdPFsTdRiYgQSeSohbS5bMu1Ox789tnAhBF\nQk5oZbRkvzMUhj8YjolVNhLNp74+Hrsem4FQWGvpq3+I6/d7le0NB3wAgJZ2UaiOS8u6tx5ui/v6\neGMc1EMl6FkSrGpnNDRTdu+kgzx+QPw+Lh7ZS/Odcc6Vgsw9KuK7KNTcclYDdj42A7sem4G5d07B\nU18fp+wrJBeFx5W+D73pmL8gxpIJSNCJpKiFUH9bWlMRLa+mj+tVE71N18YqG4kmYwwWC4sJAVTf\nKht5deT9+guB0etj9kl9HlSrcrlk6UduSWGhUnepqXCgRlckpEOIIBiKwGph8AaEuCsr1SmCLYzB\nahG/B7GAR/R7ktcTFIKLIuGkaJz2tk7tXMzeY/6CuNvIBCToRFIS+WNll4kvIGiWzutp1U2kpRKz\nrM/HpH7fk52xE6SyUMVbVJNoibjXL6DCYUVdVRkAaOqcZpNMF7pwO+2agsqA6u6j1oVwhOOAN2D4\n2kEJihk7bNr5kkKJ2a522g0v7oDYz1S+w2A4ktGC1vmEBJ1ISqJUr/IP+3/f2aQU7zWyhJVQN+n4\nqnI7bBaG2sr4ltGQukrN840HWqPV3g1+xdHaneLjxzuPafZ//dlP4n6WuOjJoZmsTZThLx16VGqt\n3WQI4QgaZi3Ay6rqPId9HWiYtQD/3a6drHY77fC4HJoiIfL3MVByJ8VLeDZQ5W6qry7T7KtUCePc\nVfsKxkWhz5P+mDqBmD9+Styeuv+7QrlApQsJOpEUWSDVflQZu6oG45q94mSokUgpE2nSD8xqYXju\npkbcfGZD3M995oZJuP2cwfifC06BzcLw3sZDyr4hPStjjvcGjF0+6h9vvFh2XyAoiWF285EAwMxx\n/fC9C4cCSC2nywnJF/yr97YobWulc/3yCm0JNrvVElMkRD4fDT1Ed1LTMT+qymz41nlDNHdB8n4A\nuP2cwZr3HTfAo8kYWSguCv339OzSXcq2nJ7gH/9zFp67qRH9PE5l38+vGo2HvjRSea6+AylmzDEK\nIqvIgjB1eH3C4+TJSCMfurIaTyUEU0fUo3eCtKi1FQ48eMVI/PjSEehRqY3dPuQL4OqJ/TC6X3VM\nP/V3CHdNHaps6/2n6te6nfaoSyjDRY7VWCwM914yHP08zpQWGCWL8dcvKtIXCVHmByQLfO9xP+qq\ny3D/jNPwxFeiVenl/ecM7am5UMtc0zhA2S6EkEUg8cSsVypvOGlQDS4e2QtPfjU61vrqctyUwJgo\nVkjQiaTIwpCsUHI8QRX3iW3dFQK30w61bp2QBFh9q6xk0dOJZF+VZRZPHGVrLpX4+ExR7bSnVLnI\nSPQ7Q1Hfuz6Jltx3+XWtugie4yejdVzVE7SJco7rKRQXRcJVxgFBY0DoV5hmy6WWT0jQiaS0BgRU\nl9uSFkqW+WTXcfzsnY3KAqNwhOMXkm+zuxONRj9cj9Ohjb4ICPD6g5q83eJx0dfGs4jlxGF2qwWV\nZbacxCUnitDQ9w0QhXvfcT/+b9F2tEghoh98cUS5M4q+r0PzOsWHrorgMRpfV6JWCiVu28hACEc4\n7nrtM+xqPqnZrxH0LN6B5RMSdCIpXn8w4Q/gm+cOjmmbs2KPUkDgo21HlUiE7lpFh3yx8doel13z\ng/X6BTz8zy8MjnMo/lOjuwfOuTiBJgnhleP74oLh2c/d73GlltNFfcy5Ty7BU4u2YfbHTTHHfV8q\n2Ky4XFTpgG0WpvEhB6XomgtHiG60QT1cmDSoBsN7VeG+S4cb9uOKcX00fS8EjC70izYfwYLPxfkW\nTXlDVZ+rpRql00eJhdbuMPgfLkayH5dFFD1Gua/V/GTGafjr8qYYX26HVI29U0g/NM9pYD16XPYY\n61vOt15msyhuCY/Ljtm3nm64ShAAAkIYwXBEEYfHvjwm7f6mQqpZF42OOay7wD351bGKj1u+yEUt\ndPH7c6oqL9ks4nmqrXCg6YnLlfb3v39e3H7UV5Xj2tMHYO6qfQUT5ldms8LlsCIU4fjmuYPx5w93\namqIqu86KsvEu0yXwwqbNEfwlxsbc97nbEIWOpEUecIwHowxxeJRI/uyjUIMu4qRu6eq3Kb0y2m3\natwX6jA7ta/dSBz1ETi5otppjym+YIRRMYyQ7uKpES6HDRYWHZfPL2RcgFN1v+UC+fv1OB2I8PgT\n34yxmHkXs0EWOpGU1oCA/jXOhMd4XI6YxE57jvlR7bTjwAnjhSzpwhhTRHhQDxe2HG5TLHT1Yky1\n2BlNihqVwssFHqcDwXAEHUJEYz3LHG3tgM1qwbr9PoNXa1HLq5wnXL3Qq1B83tnA7bSLBTek/4Wl\n2+LXLvY47XCV5X+Fa7YgQSeSkszlAkR9meMHeLBun5hnRa5wJFNlYMWnynmn1mGLLjdLP48Tdsl1\ncFqfamw53IZd0uKmqcPrsWbvCexqFp+X261w2q2G+T2ulRYc5ToULxpeGITTob1gtrR3YvJji1N+\nL3UOGvG9ozlbvIEg6qu0ESyTVQm3usL4AR7MXbUPp9TFrgPIF/1rnBDCXLloLfziiLLvtD7VmmP7\n1TgN3XdmgQSdSEgkwsVJ0SQLSWRx+sElpyIc4bjlxVUxx+gTe3WF+6YPx/RRvXBKXSXaOkJo7RBw\naq8qDKuvxKJ7z8fHO1vwliq65RdfHoNgOIJ2VUhfsknIXC+WkQXI6xfQx60V9GPtsRee3tXlmmRe\nLocVL902GeV2K0b30xaVEItoRCdFT60XFwV99uDF2N3SjgkDarrV56+fPgCNDbUYWl84gv7kV8eB\nc46dzdoVsG/fdTbGD/Bo2n739fFZzaWTb0jQiYS0B0OI8ORxx/L+GpcDo/pWx+yvqypDdZI49kTY\nrBZMGiRaleqIG8YYhtZXYv0+r+Z4h80Ch80S40vX+9DVK0dzbaHr48XVtBv4gcf2d+PwF1FBr6sq\nQ2ODsaXtdtqVFabqJfC1FQ7UVnTPOgei57uQkKtEtegugnoxB4AelWUxbWaCJkWJhMgTm8nETp10\nS1/oGRCtyWySitFlVJy5TW3B59jPrI9GUWPk69e7vRINWU4rKxdKNvNEoEyhhFLmE7LQiRiOtHbg\n7rlrEYkAM8b0BpBc7OSl8vGiKbJ9k2u0VF2Px2VHU4sfv/1gK+qry7G66Tg+3R2tbZ7ti05sf+QF\nQFrLcv76g3jw7Y1xj5epTDAn4XHaseeYH0MfeFd5bnZK4aKVDBJ0IoYXlu3GJ7tEofu0SXxMtrLu\nynF9UWYYQaabAAAaKklEQVSzGIYv5oLpo3rjjMG12HK4Da/ecYbhMR6nA96AF7//z46YfecO62l4\nZ5FNPHFcLt97fW3MsfO/ezb+u10ss3dKXQXCEY4/f2NS3PfW56Ix68pINeV2K245qwGzP27CczeZ\nK748VUjQiZRIZv0Mra/E0PqhMe0/mTECj/17i8ErMovDZsEb3zoz4TGJJkXvmTYsG91KiMthhd3K\nki4u+sf/nImx/T1KZaKZ4/vhexcl7q/eIi+UZFrZ5qErR+GhK0fluxt5g3zoREp01z+pzh+Sb6qd\ndk1SKzX5uF2XF7oky+eiLwaSSl/1x5A7ojQgQSdiMFq52F1B6OtJPYNftkl0UcrXUvZqpx2vrdyL\nT3YdS3gMEA2rTOXiqj+m3Gbe2GsiCgk6EYNflQtDpqv1I78r5SAf3FO00G8/d0j6HUuTRHHm+SrY\nIC98ujZBNSW5b0PqKlBVZsOpvariHqu8Rifo6sRchHkhHzoRQyoJo5Lxw+nD8cPpYtY+dfKnfBLP\nsv3DdRMKomJNMBSBTZcjRX3u+nqc2PDw9JTey626QBXK+SeyDwk6EUOyCjnFSjy3UT79yzYLUxJt\n+QJCxi4s5DMvTUjQiRhSydFdjMQTua66kzKJ3WpBKCK6uHyBIBzWzPSFBL00yf99JlFwGBWBMAPx\nQvcqu1lFKROMVKVJmPbbpZqIl+Ep+MrjIVv6NSUSrkiIkIVOxOD1C5g6vA63nTMYn+3x4srxffPd\npYxQXW7H09dPwJZDbXh6yQ70cZfj4StHaUQ11zx/UyN+9ObnWLRZzBAoX0zvmTYMN0wZlNZ7v3Hn\nFAzUZWEkzA1Z6ISGcISjrSOEsf09OHdYHe6eNkyJVDEDV4zti5vPagAA9HaX45JRvfPan5oKBx68\n4jTluZxTfsaYPuiZZiKpM4b0iMniSJgbEnRCgzwhauZER24lrrswxqgOmTzkDUhthdE3orggQSc0\neEtA0B02Cyoc1oLJb6Iu/PH4u2KahEKp2UkUF+RDJzTIRRHytdAmV3ytcQAaG7pX5CHTWCxMU9Qa\nyG/kDVG8JLXQGWMDGGNLGGNfMMY2McbultprGWMLGWPbpcfC+HUQaSFHWZjdQnzoylG4YmzhTPbO\nvnVyvrtAmIBUXC4hAD/gnI8EMAXAXYyxkQBmAVjMOR8GYLH0nChyfCXgcilE6HwTmSCpoHPOD3HO\nP5O22wBsBtAPwEwAc6TD5gC4KludJHKHvKiIJuVyCwk6kQm6NCnKGGsAMAHASgC9OOeHpF2HAfSK\n85o7GWOrGWOrm5ub0+gqkQtkQaeVhrlFPWdhtZi3iDGRXVIWdMZYJYB/ALiHc96q3sfFfKuxOVfF\nfc9yzhs55411dXVpdZbIPr6AgMoyG2wplHQjMke5PXq+P3vw4jz2hChmUvrVMsbsEMX8Vc75PKn5\nCGOsj7S/D4Cj2ekikUu8gSBZ53lAXf6Ozj/RXVKJcmEAXgCwmXP+W9Wu+QBulrZvBvBO5rtH5Bqf\nXyB/LkEUKanEoZ8N4EYAGxhj66S2nwB4AsDfGGO3A9gD4JrsdJHIJd4ACTpBFCtJBZ1zvgxAvFma\nizLbHSLf+AICelVX5rsbJcnsW09HKGw4FUUQKUErRQkNXr+gqXZD5I4LhtfnuwtEkUOhDIQC5xy+\nQJBcLgRRpJCglzibDvqw6aAPgFgcWghzWlREEEUKuVxKnMt/vwyAWEhYzrRIYXMEUZyQhU4o+PyU\nx4UgihkSdEJBLn9Gk6IEUZyQoJcwYsaG6DZZ6ARR3JAPvYS5+s8fK9u3zl6FD7eKydPIh04QxQlZ\n6CXM2r1eZVsWc4AsdIIoVkjQCQ0WBjip/BlBFCUk6IQGC2OazH8EQRQPJSPoHUIYD83fpJRYK2U6\nQ2HMfHpZvrtBEESGKRlB/9vqfZj9cRP+tGRHvruSdxZ8fgjr9/vy3Q2CIDJMyQh6MBQBAHRKj6WM\nEI6eg7svGpbHnhAEkUlKRtCJKKrwc1SUWWG3ks+cIMxAyQh6KCKq2LYjbXnuSf7ZcCDqbmFgtDKU\nIExCyQi6PBn68c5j+GTXsTz3Jn/sO+7Hqyv3Ks/H9HfD7YyuL7t6Yr98dIsgiAxQMitFvf5odMvu\nlpOYMqRHHnuTP1raO5XtZT+eiv41LnhcDgAnMee2yTj7lNI8LwRhBkrIQg/muwsFQYcQnRDtX+MC\nACX/+ZCeFbBZS+ZfgiBMR8n8etUWeihcupEuRhc2t7TU301L/gmiqCkZQVcvKGrtCOWxJ9nB6w+i\nYdYCNMxagNc/FX3kO5vbcdbji/Hqyj2Y/tRShMIRw4VVHqcDVgtDpaNkPHAEYUpKRtC9fgEjeldJ\n2+Zzv6zYGZ3ovX/eBgDASx834aCvAw+8tRFbj7Th2Mmgcqfy4q2nK8dff8ZAPHH1GFgsFL5IEMVM\nyZhkvoCA6aN6wxcQNO6XUqKtQ4A3IMBuZbjg1DqlfWh9JYbWV+axZwRBZIKSsNCFcATtnSF4XHa4\nnXaldqaZCKYwL+D1ixczt9NBCbgIwoSUhIXeqip+7Hba4QsI+HhHC+qryzC0viqjn/XexsPYeMCH\nU+orcOGIXjkrFtGqu0i9s+4A/rZ6v6bt7rnrUFvh0MSdEwRhHkrily1b5B6XHR6XHU0tflz//EoA\nYrX7TPLtV9Yo25eO6o1nbpyU0fePh96NdPfcdTHHHPAGcMAbwKRBNTnpE0EQuaUkXC6y2Lmddnic\nDqUYcqYJ6hJ/7ff6s/I5RngDAiocVtxxzuCkx3qoxBxBmJKSEHQ59trjcsDjsuNoW2eSV3T3c/Ln\nm/f6BWV8yaB4c4IwJyUi6FELvdpp12QbDEc4whEe55Vd40QK4ZAR3ecJ4YgmnW138QUEVEtzBMmg\nItAEYU5KQtBll4vHaY+xYC/8zYeY8vjijHzOJU8tTXrMA29vwLdeXg0ACATDGPbAuxj2wLto60jP\nuvcFgvA47XC7kmdO9FB2RYIwJaUxKSoJerXkQ1ez51ju/NwAsP1IO5qlBFlqi/74ySCqyrtvOXv9\nAobWV8b4x//53XOw5XArRvSuxpeksnOpuGUIgig+SkLQfQEB1eU2WC0sa2LGeazbRp0IS8arWtik\n9rm3pZmOwBsQlCgeNWP6uzGmvxsA8KVxffHP9QdRVV4SXztBlBwl4XLxBYRoAqos+Y8DQtjwc43a\nWjsERCJcsz+dCVXOeZd86BZaVEQQpsT0gv6TtzbgrbUHUCElnrLFKbfWYSDIXeHF5U0xbT6/oFju\nf/loJxp/vgjNbZ3gHFi0+QiuffYT5dh00hF0CBEEQxF4nA5UJ3DbUKoWgjA3pr73jkQ4XpOq82w5\nLJaeG1pXiRG9q7CzuR1COOom8foF9HZbu/1Zv3p/KwBgYK0Ld180DL/5YCsO+joQEMJwOWx4/N0t\nmuPvfHmN5nk6sfFeJSxTdLncOGUQ2joEnD+8TnPc/ZedBs6B6aN6d/uzCIIoXJIKOmPsrwCuAHCU\ncz5aaqsF8AaABgBNAK7hnJ/IXje7h9ov7bSLYm2zWvDePedhx9F2TPvtR8p+byCI3u7ytD/zl18Z\nizNP6QEhHMGseRvg9QtwpZCWNh0LXR3FwxjDo1eNNjyut7scv79uQrc/hyCIwiYVl8tsAJfq2mYB\nWMw5HwZgsfS84FD7pSvKtNa33tfsy1AGRvl95UevX0haUKPMZonJxdIV1HH2BEGULkkFnXO+FMBx\nXfNMAHOk7TkArspwv7rN7paTijiv3++Ne5xe/FLNwLhhvy9mIZL6ub76z7zP9mPtvvj9AERXyfz1\nB9HUcjJmX3tnCNuPtGF9gvdQUhtQOCJBlDTdnRTtxTk/JG0fBtAr3oGMsTsZY6sZY6ubm5u7+XGp\nM/XXH+LLf1oOAPh/r69V2r8yqb/mOIdNO/RULPS9x/z40tPLsPCLI5p29aIgOQ5cjnd/ftlufO2Z\nFQnf90hrJw75OnDBrz+M2Xfb7FW4+KmlmPnH5Vi6zfj8qVMbEARRuqQd5cLFMI64a+c5589yzhs5\n5411dXXxDssIEclS3qWzdF/75hn48fQRMcdveng6/nvfVACpTUoeaesQH1s7NO2yhfzIzFGoKBP9\n5anEu58ztCc2P6L3Zmn5dHf05mjPceNFUGofOkEQpUt3Bf0IY6wPAEiPRzPXpe6jngRVZz4cWl9p\nWF6tosyG/jVOWC0spThwn8GCICDqrunncSptqfize1Q64HRoffvdCZ/0BQTYLAwuR/ejdAiCKH66\nK+jzAdwsbd8M4J3MdCc91Fa2WnQTiStjDB6nPaUoE1m49cf6VPnWZborron6EY4zuSqvEqUqRARR\n2iQVdMbY6wBWABjOGNvPGLsdwBMALmaMbQcwTXqed77y54+V7dN/sUjZLrMlFle3K7WydHJx6eMn\nO3HW44vx9toDeOajnbj5r5+K76PKE5OKuNZWODSPAHDdc5/EOxytcdID+PwCRbgQBJE8Dp1zfl2c\nXRdluC9p09Ie6we/bvLApK/zOO0pTYrKlvie434c9HXg/nkbNEv+9X7zP31jIr7z6mcAgPEDPHj8\n6jHYfyIAp92KN1bvw4+mDwcAvP2dszHzj8twwi9gt0Gki0w8690bCNKEKEEQ5l/6f+3pA5IeIxaO\nTj4pKgvqvjiTk3orecaYPjh3WE8AwDfPHYLT+lTj4pG9cM6wnvjDdROUBUcDe7jw8u1nJP/8OH30\nkoVOEARMJOidIePJxFSiTTwuR2qTotIxRncCAGC3xj+dyXzq6n7K0Tr6whfxFh/5AgJFuBAEYR5B\njyfIqVbw6cqkqIxRhsW4JHGpq10mbZ2ir1wv4Is2H8Wx9tjyeT6/QIuKCIIwkaDHEeRE2QdlPC47\n2jpCSZfo+xKUmGvo4TJsv2vqUDhsFozv70n43hUqC14ei9FE7ffmrtU8F8IRtHWGqAoRQRDmEXRZ\n/F66bTJG96sGADxzw0TD+HM9shUfL4pE/xl6rmnsjw9/NNVw35QhPbDt55ehpiKx4DLG8NxNjdLn\niBcO+a7jxVtOx7gB4gXhkFe7qKlVyeNi6sSZBEGkgGkEXbZq1b5od4pWq/yaZH70dIpQdKcfPlWO\nFvm6pF+SG42BJwudIEod0wi6bD2rXQ/6VZjxkF/jTeBS6QyF00pxm1o/REFvajkJIRyJ5jlXzQME\nglq/vTxu8qETBGEeQZfE2O2yY+LAGgBAbYpWqyyGiRYXnf/khwCAiQNjfeHDe1d3patJ+/HgO5vw\n1WdWRHO0uByYMEAck1XnQvJRHheCICRMI+i+gADGgKoyG356+UjM/+7ZGBhnolKP7ENPtLjosJSQ\n6/ozBuHZGyfhnmnDlH23ntXQ/Y4b9AMA1u/zKu6U6nIb7p8xAjUuO3pUai9SshVPcegEQZhmJs0X\nEBfXWCwMDgvD2CRRJWpk6zYVH7nHace0kb1gl9LvjhvgSWniNRX0KQq8fgFVZTbYpPj2c4fVxeR4\n9/nJh04QhIhpLHSvv/uLa9TVhZIhLxCqKsv+tdAX0MaXe1yx8fJelRVPEERpYxoV8AYEuLtppdqs\nFlSV2QyX1s9evhu1lWXKcznpluzLdlizl+HQJ2VRlPE47WjtEBCOcFgtDLOX78Yrn+xFVXnUiicI\nonQxjQr4/MG0JgbdLuMEXXNW7MGrn+xRnjc2iJOTY/q5ccOUgfj118Z1+zONeGTmKGX7hD+oidpx\nuxzgPFoh6aF/foGW9s6U0hsQBGF+zCPogfQSVLmddkMfui8gYK+UjOvRmaOUfC02qwU/v2oMBvWo\n6PZnGnHTmQ2YdZlYXemwr0MzJnccXz9NiBIEAZjM5ZKOpeoxyIkeiXB4/UHINaC769Lpcl8kgT7k\n69D60FW+/gE1XNVOE6IEQZjAQuec4+OdLWlnHPQ4HViz5wRaJXdGKBzBkq1HFTEXj8mNJaz3m+vb\nZ3/chP0nAko7LSoiCAIwgaDPXbUP1z+3EpynZ0FXSVEit724CgDwxyU7cfuc1ZpjcuWrVqcs8Lhi\nBf2ttQcw7amPlPZUEpARBGF+il7Qdx5tV7bT8SXL0Sur95wAAGw+1BpzTK581UZ+cwCoVm2ri2Bn\nKAyeIIgip+gFXU22XSK58lXHSzBGk58EQSTCXIKeRZcIY1G3TLYxcrMAyYtdEwRR2hR9lEtINWuZ\njqDXVUUXDzXMWhCzX04rkAucdiscVguC4UhKY+qpWvhEEETpUvQWuhyVAmh9zF3lrqmnJNyfS3cH\nY0wZi/5zZ996uub5Q18aie8k6TtBEKVB0Qu6enVnOqJbZrNi0qCauPtznZ5Wtsz1fvsLhtfjkpG9\nlOe3nD2YXDEEQQAwgaCrFwNlU9hytahIxuO0w2GzoNxe9F8RQRA5oujVIlGVoUxRWWbLi4XucdqV\ncEqCIIhkFL2g+wJiYefLRvdO+73umz5c89xhteCaxv6YPqo3zhnaM+337wrnnVqHS0b1Mtz33QuH\nAoDG9UIQBME415cdzh6NjY189erVyQ9MEc45Tv3pu7jj3CH48aUjMvKeJ04GMeHRhQCApicuz8h7\nEgRBpANjbA3nvDHZcUVtofuDYQhhntEIlHQiZQiCIPJJUQu6PCGaSf+2vggzQRBEsVDUgh6tp5l5\nq7qGMhgSBFFkFPVKUblkXKbdJMt+PBUVjqI+NQRBlCBFrVqKhZ7hpFn9a1wZfT+CIIhcUNQuF8WH\nTu4RgiCI4hV0IRzB/fM2ACBBJwiCAIpY0L84GC1A4bRTLhOCIIi0BJ0xdiljbCtjbAdjbFamOpUK\nYdWCKFoeTxAEkYagM8asAP4I4DIAIwFcxxgbmamOJaNVlZSLIAiCSM9CnwxgB+d8F+c8CGAugJmZ\n6VYs+0/4sfVwGwDgsK8Df1yyI1sfRRAEUZSkE7bYD8A+1fP9AM7QH8QYuxPAnQAwcODAbn/YOb9c\nAkDMrzLl8cVKe+/q8m6/J0EQhJnI+qQo5/xZznkj57yxrq4u4++/9L6pGX9PgiCIYiQdQT8AYIDq\neX+pLavos0M6bEUbqEMQBJFR0lHDVQCGMcYGM8YcAK4FMD8z3dKiFvH2zlA2PoIgCKLo6bYPnXMe\nYox9F8D7AKwA/so535Sxnqn46dsble2ZTy/PxkcQBEEUPWnlcuGc/xvAvzPUl7io3Sq7Wk4q22/f\ndXa2P5ogCKJoKFoH9E9mjMD4AZ58d4MgCKJgKFpBz2SVIoIgCDNQFILOELu0353hlLkEQRDFTlEI\n+i1nNaChhzZHOWVYJAiC0FIUgj6whwsf/mgqnvr6OKWNBJ0gCEJLUQi6jLoyUaarFBEEQRQ7RSXo\n6tqhNClKEAShpagEXXazOGwWlNuLqusEQRBZp6hU0SNZ5R6nnYpaEARB6CgqQZfdLDQhShAEEUtR\nCbrNakFlmY385wRBEAYUlaADopVOgk4QBBFLWsm58sG9F5+K3m6qUkQQBKGn6AT9K5P657sLBEEQ\nBUnRuVwIgiAIY0jQCYIgTAIJOkEQhEkgQScIgjAJJOgEQRAmgQSdIAjCJJCgEwRBmAQSdIIgCJPA\nOOe5+zDGmgHs6ebLewJoyWB3igEac2lAYy4N0hnzIM55XbKDciro6cAYW805b8x3P3IJjbk0oDGX\nBrkYM7lcCIIgTAIJOkEQhEkoJkF/Nt8dyAM05tKAxlwaZH3MReNDJwiCIBJTTBY6QRAEkYCiEHTG\n2KWMsa2MsR2MsVn57k8mYIwNYIwtYYx9wRjbxBi7W2qvZYwtZIxtlx5rVK+5XzoHWxlj0/PX+/Rg\njFkZY2sZY/+Snpt6zIwxD2PsTcbYFsbYZsbYmSUw5u9L/9cbGWOvM8bKzTZmxthfGWNHGWMbVW1d\nHiNjbBJjbIO07/eMMdbtTnHOC/oPgBXATgBDADgArAcwMt/9ysC4+gCYKG1XAdgGYCSAJwHMktpn\nAfiltD1SGnsZgMHSObHmexzdHPu9AF4D8C/puanHDGAOgDukbQcAj5nHDKAfgN0AnNLzvwG4xWxj\nBnAegIkANqraujxGAJ8CmAKAAXgXwGXd7VMxWOiTAezgnO/inAcBzAUwM899ShvO+SHO+WfSdhuA\nzRB/CDMhCgCkx6uk7ZkA5nLOOznnuwHsgHhuigrGWH8AlwN4XtVs2jEzxtwQf/gvAADnPMg598LE\nY5awAXAyxmwAXAAOwmRj5pwvBXBc19ylMTLG+gCo5px/wkV1f0n1mi5TDILeD8A+1fP9UptpYIw1\nAJgAYCWAXpzzQ9KuwwB6SdtmOQ+/A3AfgIiqzcxjHgygGcCLkpvpecZYBUw8Zs75AQC/BrAXwCEA\nPs75BzDxmFV0dYz9pG19e7coBkE3NYyxSgD/AHAP57xVvU+6YpsmDIkxdgWAo5zzNfGOMduYIVqq\nEwH8mXM+AcBJiLfiCmYbs+Q3ngnxYtYXQAVj7Ab1MWYbsxH5GGMxCPoBAANUz/tLbUUPY8wOUcxf\n5ZzPk5qPSLdhkB6PSu1mOA9nA7iSMdYE0XV2IWPsFZh7zPsB7Oecr5SevwlR4M085mkAdnPOmznn\nAoB5AM6Cuccs09UxHpC29e3dohgEfRWAYYyxwYwxB4BrAczPc5/SRprJfgHAZs75b1W75gO4Wdq+\nGcA7qvZrGWNljLHBAIZBnEwpGjjn93PO+3POGyB+j//hnN8Ac4/5MIB9jLHhUtNFAL6AiccM0dUy\nhTHmkv7PL4I4R2TmMct0aYySe6aVMTZFOlc3qV7TdfI9U5zibPIMiFEgOwE8kO/+ZGhM50C8Hfsc\nwDrpbwaAHgAWA9gOYBGAWtVrHpDOwVakMRNeCH8ALkA0ysXUYwYwHsBq6bt+G0BNCYz5YQBbAGwE\n8DLE6A5TjRnA6xDnCASId2K3d2eMABql87QTwNOQFnx2549WihIEQZiEYnC5EARBEClAgk4QBGES\nSNAJgiBMAgk6QRCESSBBJwiCMAkk6ARBECaBBJ0gCMIkkKATBEGYhP8PV6GVZ78D1koAAAAASUVO\nRK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(random_walk_numpy(1000))\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Comparando desempenhos" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from timeit import timeit\n", "\n", "def cronometrar(expr, vezes=1000):\n", " return timeit(expr, globals=globals(), number=vezes) / vezes\n", " \n", "casos = ['RandomWalker().walk(1000)',\n", " 'random_walk(1000)',\n", " 'random_walk_itertools(1000)',\n", " 'random_walk_numpy(1000)',\n", " ]" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.001643s\tRandomWalker().walk(1000)\n", "0.001292s\trandom_walk(1000)\n", "0.000335s\trandom_walk_itertools(1000)\n", "0.000028s\trandom_walk_numpy(1000)\n" ] } ], "source": [ "tempos = []\n", "for caso in casos:\n", " t = cronometrar(caso)\n", " print(f'{t:07f}s', caso, sep='\\t')\n", " tempos.append(t)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAfkAAAD8CAYAAAB0DN3jAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XmUXVWZ9/HvzwTCnEBC0yGIQQnSROYYUAYVpAFjvwxG\nRWgI6MLlEm0RaYlDt2StphtnXkS0GQSiKAKC0B0ZFMWEAIEkDJUAgRCCkDdNACFCwNgkz/vHea45\nKerWlFTdYuf3WeuuOmefvfd57g2H5+x99q1SRGBmZmbleVOrAzAzM7O+4SRvZmZWKCd5MzOzQjnJ\nm5mZFcpJ3szMrFBO8mZmZoVykjczMyuUk7yZmVmhnOTNzMwKNbjVAdiGbcSIETF69OhWh2Fm9oYy\nZ86c5yJi267qOclbS40ePZrZs2e3OgwzszcUSU92p56n683MzArlJG9mZlYoJ3kzM7NCOcmbmZkV\nyknezMysUE7yZmZmhXKSNzMzK5STvJmZWaH8y3CspdqWLGf05GlrlS0+d0KLojEzK4tH8mZmZoVy\nkjczMyuUk7yZmVmhnOTNzMwK5SRvZmZWKCd5MzOzQjnJm5mZFcpJ3szMrFBO8mZmZoVykjczMyuU\nk7yZmVmhnOTNzMwK5SRvZmZWKCd5MzOzQjnJm5mZFcpJ3szMrFBO8mZmZoUaUEle0mJJI1odR52k\n0ZLm5fbJki5odUw9JWlTSb+XNCj3b5b0oqT/bldvJ0mzJC2U9HNJG2e5JJ2f5Q9K2qfW5ghJC/LY\n5Fr5tyQd0l/v0czMXm+9JflMBAPqpsH+6uPAdRGxKve/CZzYQb2vA9+NiJ2BF4BPZPmRwJh8fRL4\nAUDeNHw/j+8GfEzSbtnme8BkzMysZdYpKecod4GkqcA84FJJsyXNlzSlVm+xpCmS5kpqk7Rrlg+X\ndGvWvwRQrc0Zkubl6/Ta+R6RdLmkRyVdKen9kmZKekzS+E5ibZM0LG9Gnpd0UpZPlXRY9j0jY5wr\n6d1dvPcJku5qNvOQMZ4v6U5JiyRNzPL31kfQki6QdHLtc/oPSffn57iPpFskPS7pU7X20yVNy8/+\nh5LeJOnjks6r9XuqpO/m7gnADY1jEXEb8FK7eAUcAlybRVcAR+f2UcDUqNwNDJM0EhgPLIyIRRHx\nF+CqrEtEPAkMl/S3nX2OZmbWd9bHyHsMcGFEjAW+EBHjgD2A90jao1bvuYjYh2oUeGaWfQ24I9te\n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\njg04NBi1ofcAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots()\n", "posições = np.arange(len(casos))\n", "ax.barh(posições, tempos)\n", "ax.set_yticks(posições)\n", "ax.set_yticklabels(casos)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "58.389202754254384" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "max(tempos) / min(tempos)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Referências\n", "\n", "* [From Python to Numpy](http://www.labri.fr/perso/nrougier/from-python-to-numpy/). Veja também a excelente [bibliografia](http://www.labri.fr/perso/nrougier/from-python-to-numpy/#bibliography) deste livro livre.\n", " \n", "* StackExchange: [How do I move away from the “for-loop” school of thought?](https://softwareengineering.stackexchange.com/questions/254475/how-do-i-move-away-from-the-for-loop-school-of-thought)\n", "\n", "* [Python is the fastest growing programming language due to a feature you've never heard of](https://jeffknupp.com/blog/2017/09/15/python-is-the-fastest-growing-programming-language-due-to-a-feature-youve-never-heard-of/)" ] } ], "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.6.1" } }, "nbformat": 4, "nbformat_minor": 2 }