{
 "metadata": {
  "name": "",
  "signature": "sha256:6ea19109869c82ee989c8ea0599ec49401e74246a542ad0b7b05f6ef464bda19"
 },
 "nbformat": 3,
 "nbformat_minor": 0,
 "worksheets": [
  {
   "cells": [
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Sebastian Raschka 04/2014\n",
      "\n",
      "#Timing different Implementations of palindrome functions"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "import re\n",
      "import timeit\n",
      "import string\n",
      "\n",
      "# All functions return True if an input string is a palindrome. Else returns False.\n",
      "\n",
      "\n",
      "\n",
      "####\n",
      "#### case-insensitive ignoring punctuation characters\n",
      "####\n",
      "\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",
      "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",
      "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",
      "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",
      "####\n",
      "#### functions considering all characters (case-sensitive)\n",
      "####\n",
      "\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",
      "    return palindrome(my_str[1:-1])\n",
      "\n",
      "\n",
      "\n"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 10
    },
    {
     "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",
      "%timeit palindrome_stringlib(test_str)\n",
      "%timeit palindrome_stringlib2(test_str)\n",
      "%timeit palindrome_isalpha(test_str)\n",
      "\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",
        "100000 loops, best of 3: 15.3 \u00b5s per loop"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "100000 loops, best of 3: 19.9 \u00b5s per loop"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "100000 loops, best of 3: 13.5 \u00b5s per loop"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "100000 loops, best of 3: 8.58 \u00b5s per loop"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "100000 loops, best of 3: 9.42 \u00b5s per loop"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "\n",
        "\n",
        "functions considering all characters (case-sensitive)\n",
        "1000000 loops, best of 3: 508 ns per loop"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "100000 loops, best of 3: 3.08 \u00b5s per loop"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "1000000 loops, best of 3: 480 ns per loop"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n"
       ]
      }
     ],
     "prompt_number": 11
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [],
     "language": "python",
     "metadata": {},
     "outputs": []
    }
   ],
   "metadata": {}
  }
 ]
}