{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# When should we use NumPy to aggregate numerical lists?" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import timeit\n", "import numpy as np\n", "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns # if you don't have seaborn just uncomment this and the next line\n", "sns.set(style='white', context='talk') " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This code measures how much time it takes to average a list of `n` elements for different `n` values in vanilla Python (`sum(x) / len(x)`) and with NumPy (`x.mean()`)." ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def measure(stmt, sizes):\n", " return [timeit.Timer(\n", " stmt, \n", " 'import numpy as np; x = np.random.random({:d})'.format(int(size))\n", " ).timeit(number=1000) for size in sizes]" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false }, "outputs": [], "source": [ "sizes = np.logspace(1, 6, 6)\n", "vanila = measure('sum(x) / len(x)', sizes)\n", "numpy = measure('x.mean()', sizes)" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n5P8DHDN9StTrPZQAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(sizes, vanila, label='Python')\n", "plt.plot(sizes, numpy, label='NumPy')\n", "plt.axvline(50, ymax=0.23, color='k', ls='--')\n", "plt.xscale('log')\n", "plt.yscale('log')\n", "plt.legend(loc=2)\n", "plt.xlabel('# elements in a list')\n", "plt.ylabel('time to average 1000 lists');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can see that for small lists of size < 50 vanilla Python is faster, but for bigger lists NumPy is faster." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.4.4" } }, "nbformat": 4, "nbformat_minor": 0 }