{ "metadata": { "name": "", "signature": "sha256:5e2953978a2111d51888d41c8ea2e7e1ad6dbb2da80a2a0128f074882b1d0934" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "[Sebastian Raschka](http://sebastianraschka.com) \n", "\n", "- [Open in IPython nbviewer](http://nbviewer.ipython.org/github/rasbt/One-Python-benchmark-per-day/blob/master/ipython_nbs/day11_deque_container.ipynb?create=1) \n", "\n", "- [Link to this IPython notebook on Github](https://github.com/rasbt/One-Python-benchmark-per-day/blob/master/ipython_nbs/day11_deque_container.ipynb) \n", "\n", "- [Link to the GitHub Repository One-Python-benchmark-per-day](https://github.com/rasbt/One-Python-benchmark-per-day)\n" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import time\n", "print('Last updated: %s' %time.strftime('%d/%m/%Y'))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Last updated: 17/06/2014\n" ] } ], "prompt_number": 1 }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "I am really looking forward to your comments and suggestions to improve and \n", "extend this little collection! Just send me a quick note \n", "via Twitter: [@rasbt](https://twitter.com/rasbt) \n", "or Email: [bluewoodtree@gmail.com](mailto:bluewoodtree@gmail.com)\n", "
" ] }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Day 11 - One Python Benchmark per Day" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "The `deque` container data type" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "
\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The `collections` module in Python's standard library provides some convienient container datatypes that not only make your code more \"Pythonic\", but they also are optimized for performance for certain operations. Previously, we have seen how we can use the `collections.Counter` class ([Day 3: 6 different ways for counting elements using a dictionary](http://nbviewer.ipython.org/github/rasbt/One-Python-benchmark-per-day/blob/master/ipython_nbs/day3_dictionary_counting.ipynb?create=1)) to write short and efficient code to quantify items. \n", " Today, we will take a look at another `collections` class: the [`deque`](https://docs.python.org/2/library/collections.html#collections.deque) container data type." ] }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "Sections" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- [A short introduction to deques](#A-short-introduction-to-deques) \n", " \n", "- [Benchmarking via timeit](#Benchmarking-via-timeit)\n", " \n", "- [Results](#Results)\n", "\n", "- [Conclusion](#Conclusion)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "
\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "
\n" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "A short introduction to deques" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Most of you might already be familiar with `deque`s due to their popularity in C++ and might want to skip this short introduction. \n", "\n", "For all the others: `deque` (pronounced \"deck\") is short for \"double-ended queue\" and thus it is sometimes also written as \"dequeue\". This abstract data structure is quite similar to an array (or Python list), which is optimized for adding and removing elements from either the back or front. \n", "The `deque` class comes with methods that are already familiar from the Python `list` type, such as" ] }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "Common methods for Python's `list` and `deque` objects" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- `append(val)` \n", "appends and element to the right\n", "\n", "\n", "- `clear()` \n", "removes all elements\n", "\n", "\n", "- `count(val)`\n", "returns the number of elements that are equal to `val` \n", "\n", "\n", "- `extend(iterable)` \n", "adds elements to the right from an iterable object\n", "\n", "\n", "- `pop()` \n", "removes and returns an element from the right end\n", "\n", "\n", "- `reverse()` \n", "reverses elements in-place; returns `None`\n", "\n", "\n", "- `remove(val)` \n", "removes first occurence of `val` " ] }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "Methods unique to `deque` objects" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- `appendleft(val)` \n", "appends an element to the left\n", "\n", "\n", "- `extendleft(iterable)` \n", "adds elements to the left from an iterable object\n", "\n", "\n", "- `popleft()` \n", "removes and returns an element from the left end\n", "\n", "\n", "- `rotate(n)` \n", "Rotate the deque n steps to the right. If n is negative, rotate to the left. Rotating one step to the right is equivalent to: d.appendleft(d.pop()).\n", "\n", "\n" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import collections\n", "a = collections.deque([1,2,3])\n", "a.rotate(2)\n", "print(a)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "deque([2, 3, 1])\n" ] } ], "prompt_number": 1 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that `deque`s don't have equivalents to the Python `list` methods, such as `index()` for looking up values, or the `.sort()` method (although the `sorted()` function can be used as a workaround). If we want to get a slice from a `deque`, equivalent to `my_list[0:3]`, we would need to use `itertools`, for example.\n", "\n", " import itertools\n", " list(itertools.islice(my_deque, 0, 3))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "
" ] }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Benchmarking via timeit" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[[back to top]](#Sections)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import timeit\n", "import collections\n", "from copy import copy\n", "\n", "\n", "\n", "labels = ['.append()', '.insert(0,x)\\n.appendleft(x)', \n", " '.pop()', '.pop(0)\\n.popleft()', '.reverse()']\n", "list_time, deque_time = [], []\n", "\n", "n = 10000\n", "l = [i for i in range(n)]\n", "d = collections.deque([i for i in range(n)])\n", "\n", "l_cp, d_cp = copy(l), copy(d)\n", "list_time.append(min(timeit.Timer('l_cp.append(1)', \n", " 'from __main__ import l_cp').repeat(repeat=3, number=1000)))\n", "deque_time.append(min(timeit.Timer('d_cp.append(1)', \n", " 'from __main__ import d_cp').repeat(repeat=3, number=1000)))\n", "\n", "l_cp, d_cp = copy(l), copy(d)\n", "list_time.append(min(timeit.Timer('l_cp.insert(0,1)', \n", " 'from __main__ import l_cp').repeat(repeat=3, number=1000)))\n", "deque_time.append(min(timeit.Timer('d_cp.appendleft(1)', \n", " 'from __main__ import d_cp').repeat(repeat=3, number=1000)))\n", "\n", "l_cp, d_cp = copy(l), copy(d)\n", "list_time.append(min(timeit.Timer('l_cp.pop()', \n", " 'from __main__ import l_cp').repeat(repeat=3, number=1000)))\n", "deque_time.append(min(timeit.Timer('d_cp.pop()', \n", " 'from __main__ import d_cp').repeat(repeat=3, number=1000)))\n", "\n", "l_cp, d_cp = copy(l), copy(d)\n", "list_time.append(min(timeit.Timer('l_cp.pop(0)', \n", " 'from __main__ import l_cp').repeat(repeat=3, number=1000)))\n", "deque_time.append(min(timeit.Timer('d_cp.popleft()', \n", " 'from __main__ import d_cp').repeat(repeat=3, number=1000)))\n", "\n", "l_cp, d_cp = copy(l), copy(d)\n", "list_time.append(min(timeit.Timer('l_cp.reverse()', \n", " 'from __main__ import l_cp').repeat(repeat=3, number=1000)))\n", "deque_time.append(min(timeit.Timer('d_cp.reverse()', \n", " 'from __main__ import d_cp').repeat(repeat=3, number=1000)))" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 3 }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "
" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Preparing to plot the results" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[[back to top]](#Sections)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import platform\n", "import multiprocessing\n", "\n", "def print_sysinfo():\n", " \n", " print('\\nPython version :', platform.python_version())\n", " print('compiler :', platform.python_compiler())\n", " \n", " print('\\nsystem :', platform.system())\n", " print('release :', platform.release())\n", " print('machine :', platform.machine())\n", " print('processor :', platform.processor())\n", " print('CPU count :', multiprocessing.cpu_count())\n", " print('interpreter:', platform.architecture()[0])\n", " print('\\n\\n')" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 4 }, { "cell_type": "code", "collapsed": false, "input": [ "%matplotlib inline" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 5 }, { "cell_type": "code", "collapsed": false, "input": [ "import matplotlib.pyplot as plt\n", "\n", "def plot():\n", " plt.rcParams.update({'font.size': 12})\n", "\n", " fig = plt.figure(figsize=(11,13))\n", "\n", " # Setting the positions and width for the bars\n", " pos = list(range(len(list_time))) \n", " width = 0.2 \n", " \n", " # Plotting the bars\n", " fig, ax = plt.subplots(figsize=(8,6))\n", "\n", " plt.bar(pos, list_time, width,\n", " alpha=0.5,\n", " color='g',\n", " label=labels[0])\n", "\n", " plt.bar([p + width for p in pos], deque_time, width,\n", " alpha=0.5,\n", " color='b',\n", " label=labels[1])\n", "\n", " # Setting axis labels and ticks\n", " ax.set_ylabel('time in seconds\\n(for 1,000 operations on starting size 10,000)')\n", " ax.set_title('Python list and collections.deque operations')\n", " ax.set_xticks([p + 1.5 * width for p in pos])\n", " ax.set_xticklabels(labels)\n", "\n", " # Setting the x-axis and y-axis limits\n", " plt.xlim(0-width, len(list_time))\n", " plt.ylim([0, max(list_time + deque_time) * 1.5])\n", "\n", " # Adding the legend and showing the plot\n", " plt.legend(['list', 'collections.deque'], loc='upper left')\n", " plt.grid()\n", " plt.show()" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 13 }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "
" ] }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Results" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[[back to top]](#Sections)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "plot()\n", "print_sysinfo()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "Python version : 3.4.1\n", "compiler : GCC 4.2.1 (Apple Inc. build 5577)\n", "\n", "system : Darwin\n", "release : 13.2.0\n", "machine : x86_64\n", "processor : i386\n", "CPU count : 4\n", "interpreter: 64bit\n", "\n", "\n", "\n" ] } ], "prompt_number": 14 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Conclusion" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[[back to top]](#Sections)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As we can see in the plot above, the performance of the shared methods between Python `list` and `deque` objects are about the same. However, as expected, the `appendleft(x)` and `popleft(x)` methods on deques are significantly faster than workaround-approaches on Python `list`s. \n", "Thus, if our application requires a lot of adding and removing of items at both ends of the data structure, `deque`s are definitely to be preferred over `list`s." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "
\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "
\n", "
" ] } ], "metadata": {} } ] }