python_reference/benchmarks/palindrome_timeit.ipynb

306 lines
59 KiB
Plaintext
Raw Normal View History

2014-04-14 04:10:12 +00:00
{
"metadata": {
"name": "",
2014-05-07 07:04:41 +00:00
"signature": "sha256:ab859015961b19530bb3c16fe1edf4e7f9baca715bdf8187c724e8c0c4cfc8ad"
2014-04-14 04:10:12 +00:00
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
2014-05-06 20:13:21 +00:00
"[Sebastian Raschka](http://sebastianraschka.com) \n",
2014-05-07 07:04:41 +00:00
"last updated: 05/06/2014\n",
2014-04-14 04:10:12 +00:00
"\n",
2014-05-06 20:13:21 +00:00
"- [Link to this IPython Notebook on GitHub](https://github.com/rasbt/python_reference/blob/master/benchmarks/palindrome_timeit.ipynb) \n",
"- [Link to the GitHub repository](https://github.com/rasbt/python_reference) \n",
"\n",
"<br>\n",
"<br>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
2014-04-14 04:10:12 +00:00
"#Timing different Implementations of palindrome functions"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import re\n",
"import timeit\n",
2014-04-19 11:39:41 +00:00
"import string\n",
2014-04-14 04:10:12 +00:00
"\n",
"# All functions return True if an input string is a palindrome. Else returns False.\n",
"\n",
2014-05-07 07:04:41 +00:00
"#############################################################\n",
2014-04-14 04:10:12 +00:00
"#### case-insensitive ignoring punctuation characters\n",
2014-05-07 07:04:41 +00:00
"############################################################\n",
2014-04-14 04:10:12 +00:00
"\n",
"def palindrome_short(my_str):\n",
" stripped_str = \"\".join(l.lower() for l in my_str if l.isalpha())\n",
" return stripped_str == stripped_str[::-1]\n",
"\n",
"def palindrome_regex(my_str):\n",
" return re.sub('\\W', '', my_str.lower()) == re.sub('\\W', '', my_str[::-1].lower())\n",
"\n",
2014-04-19 11:39:41 +00:00
"def palindrome_stringlib(my_str):\n",
" LOWERS = set(string.ascii_lowercase)\n",
" letters = [c for c in my_str.lower() if c in LOWERS]\n",
" return letters == letters[::-1]\n",
"\n",
2014-04-19 11:54:41 +00:00
"LOWERS = set(string.ascii_lowercase)\n",
"def palindrome_stringlib2(my_str):\n",
" letters = [c for c in my_str.lower() if c in LOWERS]\n",
" return letters == letters[::-1]\n",
"\n",
2014-04-19 11:44:29 +00:00
"def palindrome_isalpha(my_str):\n",
" stripped_str = [l for l in my_str.lower() if l.isalpha()]\n",
" return stripped_str == stripped_str[::-1]\n",
"\n",
"\n",
"\n",
2014-05-07 07:04:41 +00:00
"############################################################\n",
2014-04-14 04:10:12 +00:00
"#### functions considering all characters (case-sensitive)\n",
2014-05-07 07:04:41 +00:00
"############################################################\n",
2014-04-14 04:10:12 +00:00
"\n",
"def palindrome_reverse1(my_str):\n",
" return my_str == my_str[::-1]\n",
"\n",
"def palindrome_reverse2(my_str):\n",
" return my_str == ''.join(reversed(my_str))\n",
"\n",
"def palindrome_recurs(my_str):\n",
" if len(my_str) < 2:\n",
" return True\n",
" if my_str[0] != my_str[-1]:\n",
" return False\n",
2014-05-07 07:04:41 +00:00
" return palindrome(my_str[1:-1])"
2014-04-14 04:10:12 +00:00
],
"language": "python",
"metadata": {},
"outputs": [],
2014-05-07 07:04:41 +00:00
"prompt_number": 1
2014-04-14 04:10:12 +00:00
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"test_str = \"Go hang a salami. I'm a lasagna hog.\"\n",
"\n",
"print('case-insensitive functions ignoring punctuation characters')\n",
"%timeit palindrome_short(test_str)\n",
"%timeit palindrome_regex(test_str)\n",
2014-04-19 11:39:41 +00:00
"%timeit palindrome_stringlib(test_str)\n",
2014-04-19 11:54:41 +00:00
"%timeit palindrome_stringlib2(test_str)\n",
2014-04-19 11:44:29 +00:00
"%timeit palindrome_isalpha(test_str)\n",
2014-04-14 04:10:12 +00:00
"\n",
"print('\\n\\nfunctions considering all characters (case-sensitive)')\n",
"%timeit palindrome_reverse1(test_str)\n",
"%timeit palindrome_reverse2(test_str)\n",
"%timeit palindrome_recurs(test_str)\n"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"case-insensitive functions ignoring punctuation characters\n",
2014-05-07 07:04:41 +00:00
"10000 loops, best of 3: 15.5 \u00b5s per loop"
2014-04-14 04:10:12 +00:00
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
2014-05-07 07:04:41 +00:00
"10000 loops, best of 3: 19.5 \u00b5s per loop"
2014-04-19 11:54:41 +00:00
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
2014-05-07 07:04:41 +00:00
"100000 loops, best of 3: 11.7 \u00b5s per loop"
2014-04-14 04:10:12 +00:00
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
2014-05-07 07:04:41 +00:00
"100000 loops, best of 3: 8.24 \u00b5s per loop"
2014-04-14 04:10:12 +00:00
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
2014-04-19 11:49:30 +00:00
"\n",
2014-05-07 07:04:41 +00:00
"100000 loops, best of 3: 9.38 \u00b5s per loop"
2014-04-14 04:10:12 +00:00
]
},
{
2014-04-19 11:49:30 +00:00
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"\n",
"\n",
"functions considering all characters (case-sensitive)\n",
2014-05-07 07:04:41 +00:00
"1000000 loops, best of 3: 507 ns per loop"
2014-04-19 11:49:30 +00:00
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
2014-04-19 11:54:41 +00:00
"100000 loops, best of 3: 3.08 \u00b5s per loop"
2014-04-19 11:49:30 +00:00
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
2014-05-07 07:04:41 +00:00
"1000000 loops, best of 3: 581 ns per loop"
2014-04-19 11:49:30 +00:00
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n"
2014-04-14 04:10:12 +00:00
]
}
],
2014-05-07 07:04:41 +00:00
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import timeit\n",
"\n",
"funcs_s = ['palindrome_short', 'palindrome_regex', 'palindrome_stringlib', \n",
" 'palindrome_stringlib2', 'palindrome_isalpha'] \n",
"\n",
"funcs_ins = ['palindrome_reverse1', 'palindrome_reverse2', 'palindrome_recurs']\n",
"\n",
"times_s, times_ins = [], []\n",
"\n",
"for f in funcs_s:\n",
" times_s.append(min(timeit.Timer('%s(test_str)' %f, \n",
" 'from __main__ import %s, test_str' %f)\n",
" .repeat(repeat=3, number=1000)))\n",
" \n",
"for f in funcs_ins:\n",
" times_ins.append(min(timeit.Timer('%s(test_str)' %f, \n",
" 'from __main__ import %s, test_str' %f)\n",
" .repeat(repeat=3, number=1000)))"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 13
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%pylab inline"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 8
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import matplotlib.pyplot as plt\n",
"\n",
"labels = [('cy_lstsqr', 'Cython implementation'), \n",
" ('lin_lstsqr_mat', 'numpy matrix equation'),\n",
" ('numpy_lstsqr', 'numpy.linalg.lstsq()'), \n",
" ('scipy_lstsqr', 'scipy.stats.linregress()')] \n",
"\n",
"matplotlib.rcParams.update({'font.size': 12})\n",
"\n",
"fig = plt.figure(figsize=(10,8))\n",
"for f in funcs_s:\n",
" plt.plot(orders_n, times_n[lb[0]], 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.xlim([1,max(orders_n) + max(orders_n) * 10])\n",
"plt.legend(loc=2)\n",
"plt.grid()\n",
"plt.xscale('log')\n",
"plt.yscale('log')\n",
"plt.title('Performance of least square fit implementations for different sample sizes')\n",
"plt.show()"
],
"language": "python",
"metadata": {},
"outputs": []
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import matplotlib.pyplot as plt\n",
"\n",
"x_pos = np.arange(len(times_s))\n",
"plt.bar(x_pos, times_s, align='center', alpha=0.5, color=\"green\")\n",
"plt.xticks(x_pos, funcs_s, rotation=90)\n",
"plt.ylabel('time per computation in ms')\n",
"plt.title('Performance of different case-sensitive palindrome functions')\n",
"plt.grid()\n",
"plt.show()\n",
"\n",
"x_pos = np.arange(len(times_ins))\n",
"plt.bar(x_pos, times_ins, align='center', alpha=0.5, color=\"blue\")\n",
"plt.xticks(x_pos, funcs_ins, rotation=90)\n",
"plt.ylabel('time per computation in ms')\n",
"plt.title('Performance of different case-insensitive palindrome functions')\n",
"plt.grid()\n",
"plt.show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\nJ06wkpKSavO+e/dulceutLSUubm5scWLF7OnT5+y3377jZmZmbGrV68yxhiLi4tjo0ePrvaxnz17\nNuvTpw97+PAhu3nzJuvYsSNr3bq1ynNT8U+wceNGlRcGuVzOZDKZ8CJUWFjIHB0d2caNG5lSqWTn\nzp1j1tbW7NKlS4yx8j98CwsLdvz4ccZYeaHr0qUL+/jjj9nTp0/ZP//8w9q0acN+/fVXxhgTnov9\n+/ezsrIy9v7777OePXuqjU2dkydPMgsLC+FvKycnh125cqXa5+3cuXOMMcZiY2PZpEmTmEKhYAqF\ngh09epQxxphSqawx3md99dVXLDg4mD158oSVlZWxs2fPskePHjHGGAsNDWWTJk1iRUVF7M6dO6x7\n9+5CwUtISGAGBgbs66+/ZmVlZWzt2rXMwcFBeIzNzc1Zeno6Y4yxvLw8dvHiReF21b1wM6baIpXL\n5czY2JgVFBQwxhhTKBTM3t6enTx5UmN8z5o3bx4zMDBgP/30E1MoFGz58uXM1dWVKRQKxhhjO3bs\nYLm5uYwxxrZt28ZMTExYXl6expgjIiKYlZUVO336NFMoFGzUqFEsLCyMMVb+hsDMzEy4z5UrV7Im\nTZqoFJsmTZqw+Ph4plQq2ZMnT9jo0aNZaGgoKywsZHK5nLVr167K/hs3bmRlZWVszpw5rFWrVmzq\n1KmstLSUpaSkMDMzM/b48WPGGGMzZ85kQ4YMYQ8fPmQFBQUsODiYvf/++2ofn9TUVJXioq7YVP5b\nrunvXqFQMG9vbxYTE8OKiopYcXExO3bsGGOs6v8nY0zl9fDgwYPM2tqanTt3jpWUlLBp06axPn36\nqDz2wcHB7N9//2U3btxgNjY2wt92WFgYW7RoEWOMsZKSEuE+q9Ngi42zszMzNTVllpaWzNnZmU2Z\nMoU9efKELVmypMoL5cCBA4V3GIGBgWzevHkq10dGRqpUcjc3N5V3hb/++itzcXFhjJU/6U2bNhXO\ndBgrf6IHDBggbO/Zs4eZmpoK74AePXrEZDIZ+/fff9XmEhoaylatWiUc38jISOUdYcuWLdnJkyeZ\nUqlkRkZG7MKFC1WOoSnvyo4cOcLs7OxULhsxYgSLi4sT8gkPD1cbK2Osyovl+vXrVf4RKv8TPPvC\ncP36dZVi88MPPzB/f3+V40dFRbH58+czxspfPCIiIoTr0tLSmJOTk8r+ixYtYmPHjhVi79+/v3Dd\nxYsXmZGRkdrY1ImKimIxMTHVXl9Z5edt7ty5bMiQISwjI0NlH03xPuvbb79lL7/8cpXnOC8vjzVr\n1kzlnfDWrVtZ3759GWPlj7O7u7tw3ePHj5lMJmO3b99mhYWFzNLSkv3000/C2FmFuhQbxhjr3bs3\n27x5M2Os/CzBzc2tVvE9a968eczPz0/YLisrY/b29uz3339Xu7+Pjw/bvXu3xpgjIyPZxIkTheuS\nkpJY+/btGWOMbdq0SeU+GWPM0dFRpXhUfq4UCgVr2rQpu3z5snDZunXrWGBgoLB/27ZthesuXLjA\nZDIZu3PnjnCZlZUV+/PPP1lZ
"text": [
"<matplotlib.figure.Figure at 0x105618160>"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\n8ff3Nyi+Wy1btkyEh4cry1VV
"text": [
"<matplotlib.figure.Figure at 0x1056baba8>"
]
}
],
"prompt_number": 29
2014-04-14 04:10:12 +00:00
}
],
"metadata": {}
}
]
}