{ "metadata": { "name": "", "signature": "sha256:1cf9fed59f911c506a34b177b74c4a9571a4bae81e37f5af07c5cc31d43aff77" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "[Sebastian Raschka](http://sebastianraschka.com) \n", "last updated: 05/09/2014\n", "\n", "- [Open in IPython Notebook viewer](http://nbviewer.ipython.org/github/rasbt/One-Python-benchmark-per-day/blob/master/ipython_nbs/day3_dictionary_counting.ipynb?create=1)\n", "- [Link to this IPython notebook on Github](https://github.com/rasbt/One-Python-benchmark-per-day/blob/master/ipython_nbs/day3_dictionary_counting.ipynb) \n", "- [Link to the GitHub Repository One-Python-benchmark-per-day](https://github.com/rasbt/One-Python-benchmark-per-day)\n", "\n", "
\n", "
\n", "I would be happy to hear your comments and suggestions. \n", "Please feel free to drop me a note via\n", "[twitter](https://twitter.com/rasbt), [email](mailto:bluewoodtree@gmail.com), or [google+](https://plus.google.com/118404394130788869227).\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Day 3 - One Python Benchmark per Day" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 6 different ways for counting elements using a dictionary\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "**-> [skip to the results](#Results)**\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "
" ] }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "Dictionary counting functions" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from collections import defaultdict\n", "from collections import Counter\n", "\n", "def add_element_check1(elements):\n", " \"\"\"if ele not in dict (v1)\"\"\"\n", " d = dict()\n", " for e in elements:\n", " if e not in d:\n", " d[e] = 1\n", " else:\n", " d[e] += 1\n", " return d\n", " \n", " \n", "def add_element_check2(elements):\n", " \"\"\"if ele not in dict (v2)\"\"\"\n", " d = dict()\n", " for e in elements:\n", " if e not in d:\n", " d[e] = 0\n", " d[e] += 1 \n", " return d\n", " \n", " \n", "def add_element_except(elements):\n", " \"\"\"try-except\"\"\"\n", " d = dict()\n", " for e in elements:\n", " try:\n", " d[e] += 1\n", " except KeyError:\n", " d[e] = 1\n", " return d\n", " \n", " \n", "def add_element_defaultdict(elements):\n", " \"\"\"defaultdict\"\"\"\n", " d = defaultdict(int)\n", " for e in elements:\n", " d[e] += 1\n", " return d\n", "\n", "\n", "def add_element_get(elements):\n", " \"\"\".get() method\"\"\"\n", " d = dict()\n", " for e in elements:\n", " d[e] = d.get(e, 1) + 1\n", " return d\n", "\n", "\n", "def counter_object(elements):\n", " \"\"\"Counter object\"\"\"\n", " return Counter(elements)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "
" ] }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "Dataset 1 - \"I have a dream\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "The first data set will be Martin Luther King's popular \"I have a dream\" speech for which we want to count the occurences of the individual words. The data file can be downloaded from [here](https://raw.githubusercontent.com/rasbt/One-Python-benchmark-per-day/master/data/day3_dictionary_counting/i_have_a_dream_speech.txt).\n", "
" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def read_speech(datafile):\n", " \"\"\" \n", " Reads in a text file and returns individual words\n", " in lowercase and stripped from digits and punctuation\n", " \n", " \"\"\"\n", " def strip_word(word):\n", " out = []\n", " for char in word:\n", " if char.isalpha():\n", " out.append(char.lower())\n", " return \"\".join(out)\n", " \n", " with open(datafile,'r') as infile:\n", " for line in infile:\n", " line = line.strip()\n", " if line:\n", " for word in line.split():\n", " yield strip_word(word)\n", " \n", "speech_file = '../data/day3_dictionary_counting/i_have_a_dream_speech.txt'\n", "speech = list(read_speech(speech_file))" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "
" ] }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "Dataset 2 - DNA string" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Secondly, we will cound the individual nucleotides (\"A\", \"G\", \"C\", or \"T\") in a randomly generated DNA string. The file can be found [here](https://raw.githubusercontent.com/rasbt/One-Python-benchmark-per-day/master/data/day3_dictionary_counting/random_dna.txt)." ] }, { "cell_type": "code", "collapsed": false, "input": [ "def read_dna(datafile):\n", " with open(datafile,'r') as infile:\n", " return list(infile.read())\n", "\n", "dna_file = '../data/day3_dictionary_counting/random_dna.txt'\n", "dna = read_dna(dna_file) " ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 3 }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "
" ] }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "Timing" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import timeit\n", "from functools import reduce\n", "\n", "\n", "funcs = ['add_element_check1', 'add_element_check2',\n", " 'add_element_except', 'add_element_defaultdict',\n", " 'add_element_get', 'counter_object']\n", "\n", "times_n = {f:[] for f in funcs}\n", "\n", "for d in [speech, dna]:\n", " for f in funcs:\n", " times_n[f].append(min(timeit.Timer('%s(d)' %f, \n", " 'from __main__ import %s, d' %f)\n", " .repeat(repeat=3, number=1000)))" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 4 }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "
" ] }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "Setting up the plots" ] }, { "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('interpreter:', platform.architecture()[0])\n", " print('CPU count :', multiprocessing.cpu_count())\n", " print('\\n\\n')" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 18 }, { "cell_type": "code", "collapsed": false, "input": [ "%matplotlib inline" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 19 }, { "cell_type": "code", "collapsed": false, "input": [ "labels = [('add_element_check1', 'if-else statements (v1)'), \n", " ('add_element_check2', 'if-else statements (v2)'),\n", " ('add_element_except', 'try-except blocks'),\n", " ('add_element_defaultdict', 'using collections.defaultdict'),\n", " ('add_element_get', 'using the .get() method'),\n", " ('counter_object', 'using collections.Counter'),\n", " ] " ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 20 }, { "cell_type": "code", "collapsed": false, "input": [ "from numpy import arange\n", "import matplotlib.pyplot as plt\n", "\n", "def plot_timings():\n", "\n", " plt.rcParams.update({'font.size': 12})\n", "\n", " ind = arange(2) # the x locations for the groups\n", " width = 0.15\n", "\n", " fig = plt.figure(figsize=(10,8))\n", " ax = fig.add_subplot(111)\n", " colors = [(0,'b'), (1,'c'), (2,'g'), (3,'r'), (4,'y'), (5, 'm')]\n", "\n", " for l,c in zip(labels,colors):\n", " ax.bar(ind + c[0]*width,\n", " times_n[l[0]], \n", " width,\n", " alpha=0.5,\n", " color=c[1],\n", " label=l[1])\n", "\n", " ax.set_ylabel('time in milliseconds')\n", " ax.set_title('Methods for counting elements in a dataset using a dictionary')\n", " ax.set_xticks(ind + width)\n", " ax.set_xticklabels(['Luther speech', 'DNA string'])\n", " ax.set_xlim(-0.1,2)\n", " ax.set_ylim(0,1.5)\n", " plt.legend(loc='upper left')\n", " plt.show()" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 28 }, { "cell_type": "code", "collapsed": false, "input": [ "import prettytable\n", "\n", "def count_unique(input_data):\n", " unique = 0\n", " count_dict = add_element_check1(input_data)\n", " for count in count_dict.values():\n", " if count == 1:\n", " unique += 1\n", " different_ele = len(count_dict)\n", " unique_ele = round(unique / different_ele * 100, 2)\n", " return (different_ele, unique_ele)\n", "\n", "def summary_table():\n", "\n", " speech_different, speech_unique = count_unique(speech)\n", " dna_different, dna_unique = count_unique(dna)\n", "\n", " fit_table = prettytable.PrettyTable([\"\", \"total elements\" ,\n", " \"different elements\", \n", " \"unique elements (%)\"])\n", " fit_table.add_row([\"DNA string\", len(dna), dna_different, dna_unique])\n", " fit_table.add_row([\"Luther speech\", len(speech), speech_different, speech_unique])\n", "\n", " print(fit_table)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 29 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Results" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print_sysinfo()\n", "summary_table()\n", "plot_timings()" ], "language": "python", "metadata": {}, "outputs": [ { "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.1.0\n", "machine : x86_64\n", "processor : i386\n", "interpreter: 64bit\n", "CPU count : 2\n", "\n", "\n", "\n", "+---------------+----------------+--------------------+---------------------+\n", "| | total elements | different elements | unique elements (%) |\n", "+---------------+----------------+--------------------+---------------------+\n", "| DNA string | 4000 | 4 | 0.0 |\n", "| Luther speech | 1667 | 536 | 65.67 |\n", "+---------------+----------------+--------------------+---------------------+\n" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\noMr2WVlZFf8xlzvggANYu3YtEIYLt27dSo8ePSq16dGjR43nJGVlZdGtW7dK+wMq9vnOO+8wf/58\nsrOzKy45OTmsWLGC4uLitPezZMkSunfvXqnHJvF1lPd2tWjRotL+CgsLq93Xl19+SbNmzZLel5OT\nA8D69etTPj7xfQDIzc3lyCOP3GFb+TDhu+++S1lZGcccc0ylekePHp3We1Pde7948WJ69OhRKUAe\neeSRNG/enMWLFwOwdOlSjj/++ErPe8IJJ1S7b0nSzrFnbDfUoEGDHQJQ4jIFw4cPp2/fvkyfPp2Z\nM2cyatQobr75Zu64446Uz9u4ceNKt7Oysti2bdsO22pLgwYNKj1f+fXyfZaVlXHKKafw4IMP7vDY\n5s2bp72fdGretm0bhx9+OC+//PIO91V31GmLFi0oLS1Net+XX35Z0aYqjRo1qnQ7Kytrh23ldcb/\nnDt37g71pfN6q3vvnfgvSbsPe8Z2Q23atGHVqlWVtr333ns7/CfcoUMHrrrqKp5//nlGjhzJxIkT\na7zPTp060bhxY+bMmVNp+7x586r9z79x48aVDgRI17HHHsuiRYs46KCD6NixY6VLq1at0n6eI444\ngnfeeadSsJw3b16lNt27d2fZsmVkZ2fvsK/c3NyK1wHs8FoOOeQQVqxYkXTfK1asIC8vr8ohynTF\nv8/HHHNMxfMn1ht/IEdN3/suXbowb968SiF/4cKFfPnll3Tt2hUI7+vbb79d6XGJtyVJu84wths6\n5ZRTmDFjBi+88ALFxcWMGTOGwsLCip6MjRs3cs011zBr1iyWL1/OggULmD59Ol26dKl4jsRej+p6\nQZo2bcqVV17J8OHDmTZtGkVFRdxyyy0sXbq02jDWoUMHZs6cyerVq3dq4v21117Lt99+y09+8hMK\nCwspKSmhsLCQW265hblz56Z83IMPPsjhhx9ecfvqq69m7dq1XHXVVSxdupRZs2Zxyy23ANsDTt++\nfenQoQNnnnkmb7zxBiUlJfz1r39l9OjRFRP327dvT4MGDZg2bRqffvppRa/XSSedxOeff05JSckO\ntcybN4/8/PwqX2dZWVnS30dV2zp16kT//v254ooreOqppyguLmbhwoU89thj3H333RWP2ZX3fsOG\nDfTr14/FixdTWFjIxRdfTM+ePSuGIm+88Uaee+45HnjgAT766CMef/zxao8clSTtvIwbpszOzq3X\nhVizs3N3+jGXXnopixYt4pprrmHr1q1cdNFFXHfddUyZMgUIQ17r169nwIABrF69mpycHHr16sU9\n99xT8RyJASpZoEo84nLs2LF89dVX9OnThwYNGtCnTx/69etX7dGC48aNY/DgweTl5fHNN99U9NSk\n2me5Nm3aMHfuXIYNG8a5557Lhg0byM3NpWfPnlWu7v75559TVFRUcfvAAw/klVde4frrr+fJJ5+k\nc+fOjBkzht69e9OkSRMA9t13X2bPns3w4cO57LLLWLduHa1bt+a4446jd+/eAHzve99j9OjRjBkz\nhuuvv56ePXsyc+ZMDjvsMI499lhefPFFbrjhhor9btmyhT//+c+89NJLVb4/yY5sTWfb5MmTGTdu\nHHfddRfLli0jJyeHrl27cu2111a02ZX3/vXXX+fmm2+me/fu7Lvvvpx55pncd999FW1++tOfMm7c\nOO6++26GDh3KiSeeyNixY7nsssuqfL2SpJ2zpx+jXpaqx8c5MbWjV69etGrViueffz7qUnbKm2++\nSX5+Pv/4xz8q9RjW1DPPPMNdd91VMbkdwtGHv/3tb3n//fd3+flVO/y7VyYaMqRfvZ5ZZmdNmlTC\n2LFPRF3GbiH2pXiH7OUwpSosWrSIJ598kqKiIhYtWsSQIUMoKCjYYQHa3dHEiROZM2cOJSUlvPrq\nq1xxxRX06NGjVoIYQJ8+fdhvv/0qQum3337LqFGjKg0ZSpJUExk3TKnUsrKymDRpEoMGDap09OFp\np50WdWnVWrlyJWPGjGHt2rXk5uZy2mmnMXbs2FrdR/wK9g0bNmTp0qW1+vySpMxkGFOFLl26VDlx\nfnc2evToikVVJUnakzhMKUmSFCHDmCRJUoQMY5IkSREyjEmSJEXIMCZJkhQhw5gkSVKEMm5pizuH\n3knpmtJ62192bjbDxwyvt/2V69ChA1dccQXDhg2r933vrIKCAnr16sUnn3zCgQceSElJCR07dqSw\nsJDjjz++Tvfdr18/Vq1axRtvvFGn+5EkKZWMC2Ola0oZmDew3vY3qWRSve0r3rvvvst3vvOdSPa9\nO3rqqae45JJL2LZtW6Xt48eP32FbVDZv3sy9997LH//4Rz7++GOaNGnCIYccwkUXXcSAAQPYb7/9\n6rWeyy+/nI8//phZs2bV634lKdNkXBjLFK1atYq6hD1CdnZ21CUAsGHDBk466STWrFnD7bffznHH\nHUfz5s155513eOCBB2jXrh3nnHNO1GXW2Ndff02jRo2iLkOSdkvOGdsN5efn73A+yDvvvJMOHTpU\n3F68eDGnn346LVu2pFmzZhxxxBE89dRTFffn5eVx1113Vbr9m9/8hkGDBtGqVStyc3O54YYb+Pbb\nbyvabNmyhf/6r/+iRYsW7L///lx33XUMGzaMQw45pMp6N27cyPXXX0+7du1o0qQJHTp0qLQa/ocf\nfsiZZ55JdnY22dnZnHPOOXz88cc79Z6sXbuWfv360aZNG3JycjjxxBN56623KrX5+OOPOe+882jV\nqhVNmzalW7duTJs2jYKCAi655BIAGjRoQIMGDejfvz8QhilPPfXUSs9zzz330LFjR/bdd186derE\n/fffX+n+dN7LwsJCTjjhBHJycsjJyeGoo47i9ddfT/n6brnlFoqKipg3bx5XXHEFRx55JO3bt+e8\n887jzTff5KSTTtqp+uJ/9xB6uU4++eSK2+X/xu644w4OOOAAWrVqxaWXXsqmTZsAGDFiBI899hiz\nZ8+ueM/+8Ic/AOH3PWjQINq2bUvTpk05+uijeemllyqeu6SkhAYNGvDMM8/Qu3dvmjVrxm233Zby\ntUtSprNnbDeUlZVVfmb3lC688EKOPPJI5s6dS5MmTfjggw8qhYFkzzF+/HiGDh3K3/72N9577z36\n9u1L165dK4LJkCFDeOWVV3jqqac47LDDePzxx5k4cSKtW7dOWUdZWRlnnXUWn3zyCQ8++CBHHnkk\nq1at4sMPPwRCwDvttNM49NBDefPNNykrK+Omm27ijDPOYMmSJWn1lmzZsoWTTz6ZLl26MH36dFq0\naMGzzz7Lqaeeyt///nc6d+7MmjVrOP744+nWrRv/+7//y4EHHsjixYtp2LAhJ5xwAg8++CDXXnst\na9asAag05Bf/Pk2YMIHbbruNBx54gJNPPpkZM2Zw/fXXk52dXfE+VfdefvPNN5xzzjn079+/IsAs\nWrQo5bDxtm3bePrpp+nbty/t27dP2qZ58+Zp15fq30/ithdeeIH+/fsze/ZsVqxYwQUXXED79u25\n/fbb+dWvfkVxcTElJSW8+OKLAOTk5FBWVsbZZ59NVlYWf/zjHznwwAN54403uOCCC3jttdfo1atX\nxfMPGTKEu+++m4kTJ1JWVpbitytJMoztoVauXMmNN95I586dgdAbUp2ePXty8803A3DwwQfz+OOP\n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\nRU5ErkJggg==\n", "text": [ "" ] } ], "prompt_number": 30 }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Conclusion\n", "The bar plot indicates that the performance of the different approaches really depends on how many duplicates we have in our data set. But this can be easily explained:\n", "\n", "### Scenario 1: No or very low number of duplicates\n", "Here, expect that the try-except loop would not perform very well, since an error is raised (and eventually the except-block executed) if we encounter an element that is not already in the dictionary. \n", "\n", "### Scenario 2: High number of duplicates\n", "The try-except method performs much better if we have a high number of duplicates, because the sumation in the try-block succeeds if we are encountering elements that already exist as keys in the dictionary - the except-block can be skipped in this case. \n", "\n", "Anyway, for a real application, I would use the `Counter` function from the `collection` module, it is the fastest approach in any case." ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] } ], "metadata": {} } ] }