{
 "metadata": {
  "name": "",
  "signature": "sha256:83f39cc728d5f76d510e01526f3d2dff31aa66ee6da8f588cbfbea124fd94ac6"
 },
 "nbformat": 3,
 "nbformat_minor": 0,
 "worksheets": [
  {
   "cells": [
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "%matplotlib inline"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 282
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "import numpy as np\n",
      "import pandas as pd\n",
      "import matplotlib.pyplot as plt"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 283
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "ran_t = np.arange(0.0, 1.0, 1/44100, dtype=np.float32)\n",
      "ran_t"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 284,
       "text": [
        "array([  0.00000000e+00,   2.26757365e-05,   4.53514731e-05, ...,\n",
        "         9.99931931e-01,   9.99954641e-01,   9.99977291e-01], dtype=float32)"
       ]
      }
     ],
     "prompt_number": 284
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "#No decorator"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "def g(freq, t) -> np.int16:\n",
      "    return np.sin(freq * 2 * np.pi * t)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 285
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "vectorized_secs = %timeit -o Hz_17 = g(17, ran_t)\n",
      "vectorized_secs.best"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "1000 loops, best of 3: 457 \u00b5s per loop\n"
       ]
      },
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 286,
       "text": [
        "0.0004566969659936149"
       ]
      }
     ],
     "prompt_number": 286
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "Hz_17_16bit = np.int16(np.float32(32767) * Hz_17)\n",
      "Hz_17_16bit"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 287,
       "text": [
        "array([   0,   79,  158, ..., -238, -158,  -79], dtype=int16)"
       ]
      }
     ],
     "prompt_number": 287
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "ran_t.dtype, Hz_17.dtype, Hz_17_16bit.dtype"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 288,
       "text": [
        "(dtype('float32'), dtype('float64'), dtype('int16'))"
       ]
      }
     ],
     "prompt_number": 288
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "plt.plot(Hz_17_16bit);"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "display_data",
       "png": "iVBORw0KGgoAAAANSUhEUgAAAZYAAAEACAYAAACQx1DIAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJztvXuQHdV97/v5jTSjB3pLoDcgYoElm/hBAr4+jjM2NpZ9\nCJAK15Cq63DP0UnVCSfXvsmpHJv4HCOVK8Tk1g1xbspc1wnHBhJzTIUY4wrBKNgTJ7kBYQxGWAiJ\nh7BmhCTQ+4FGM9Lv/rG6Na1W7727e/12d49mfat2Te+19/7Nbz1+77W6RVUJCAgICAiwQk/dDAQE\nBAQEnFsIhiUgICAgwBTBsAQEBAQEmCIYloCAgIAAUwTDEhAQEBBgimBYAgICAgJMYWJYRGSSiDwr\nIt+L3s8TkQ0islVEHheROYnv3iYi20Rki4hck2i/QkQ2RZ99NdE+RUS+HbU/KSIXWfAcEBAQENAd\nWEUsnwM2A/GhmC8AG1T1UuCJ6D0ishq4CVgNrAG+JiIS/eZuYK2qrgRWisiaqH0tsDdqvwu404jn\ngICAgIAuwNuwiMgy4FPAXwKxkbgOuDe6vhe4Ibq+HnhAVUdUdTvwMnCViCwGZqrqxuh79yV+k6T1\nEHC1L88BAQEBAd2DRcRyF/AHwKlE20JV3R1d7wYWRtdLgMHE9waBpRntQ1E70d8dAKo6ChwUkXkG\nfAcEBAQEdAFehkVErgX2qOqzjEUrZ0DdPWPCfWMCAgICJggme/7+g8B1IvIpYCowS0TuB3aLyCJV\n3RWlufZE3x8Clid+vwwXqQxF1+n2+DcXAjtFZDIwW1X3pRkRkWC8AgICAgpCVTODAh94RSyq+oeq\nulxVVwA3Az9Q1c8AjwC3RF+7BXg4un4EuFlE+kRkBbAS2Kiqu4BDInJVVMz/DPDdxG9iWjfiNgO0\n4qdRr9tvv712HgJP5w5PTeUr8DR+eeoWfCOWNGJOvwI8KCJrge3ApwFUdbOIPIjbQTYK3KpjvbsV\n+CYwDXhUVR+L2u8B7heRbcBenAELCAgICGgozAyLqv4j8I/R9T7gYy2+dwdwR0b7M8DlGe3DRIYp\nICAgIKD5CCfvu4j+/v66WTgLgad8aCJP0Ey+Ak/50ESeugXpZp6tSoiInit9CQgICKgCIoI2rXgf\nEBAQEBCQRjAsAQEBAQGmCIYlICAgIMAUwbAEBAQEBJgiGJaAgICAAFMEwxIQEBAQYIpgWAICAgIC\nTBEMS0BAQECAKYJhCQgICAgwRTAsAQEBAQGmCIYlICAgIMAUwbAEBAQEBJgiGJaAgICAAFOck4Zl\n92743d+F48dt6H3xi7Bpkw2tv/kb+MY3bGi98gr8/u/DqVP+tEZH4T/+R3j9dX9aAF//Onzveza0\nnnoK/ut/taF1+DCsXQv7znq4dTn80R/Bj35kQ+v734c//VMbWnv2NFcGHnwQ/uqvbGht2waf/ayN\nDIyMwO/8jp0M3H03fOc7NrR+8hNYt86GViWo+9GYho/Y1Bhf+YoqqD7yiHpj82ZH6z/8B39aqqrT\npzt6p0750/rc5xytH//Yn9YTTzhat9/uT2tkxNG65BJ/Wqqqn/60ozc46E/rr//a0fr61/1pvfWW\no/WJT/jTUlW98kpH7+23/Wndeae9DPz2b/vTUlWdOtVOBn7v9xytp5/2pzUw4Gh96Uv+tGIZuPBC\nf1qqqjfe6OgNDdnQixHpTXN9fE5GLM8+Cxde6Ky8L555Bi66CJ57zp/WwYMgAvPmwc6d/vR+8hPX\nz2ee8af19NOwYoX764uXX4Zly2BoCE6c8Kf31FPwjnfY8Pbkk66fGzf603ruObjkEpu1cfIkvPgi\nXHwxPP+8P73nnrNbG88+6/iyGP+DB2HSJDj/fLc+fPH00443i34++aSbT4t+vvQSLF/uIkcLGXj+\neaeHLNZtFTgnDcsLL8BNN8HPfuZP66WX4PrrYcsW8H2O2AsvwLveBatWuRDeF5s2wc03w+bN/rRe\nfBF+4zecUfDFCy/A+9/vBOvVV/1onTjhjPAnP2nD20svwa//ug2trVuhv9+l1w4d8qO1YwfMng1X\nXmnD2/PPOxmwWBsvvODWxrZt/jLw4otu/V92mY0MbNsGN9xg088tW9zasODr1Vfh8sudcfel9/bb\n8POfw7XX2qyNKuBlWERkqog8JSLPichmEfnjqH2eiGwQka0i8riIzEn85jYR2SYiW0TkmkT7FSKy\nKfrsq4n2KSLy7aj9SRG5qBNf27fDRz/qJsMXW7c6YZ861XkfPtixw3lXK1f6L5DDh2F4GH75l21y\nwoOD8OEPO1onT/rR2r7deX7veIerA/nytXixo/Xaa360wM1Bf78/X+AUxmWXOd5853Nw0BniX/gF\nG95ef91OBrZvh/e9D6ZN85eBV191fVy50l/hHjrk5OCDH7Tp5+Ag/MqvuDXiKwOvvupk4KKLHD0f\n7NgBS5bAO9/p76hVBS/DoqrHgY+o6nuBXwQ+IiIfAr4AbFDVS4EnoveIyGrgJmA1sAb4mojEj8W8\nG1irqiuBlSKyJmpfC+yN2u8C7mzH0+HDzqtatcom1B4acmmdJUvgjTf8aO3c6egsW+afCnvjDUdr\n6VKbfg4OOgU5Z47b/ODL2+LF7uU7Zq+/7oTz4oudgvOBqhPSD34Qdu1yGxZ8MDjoPNKlS/37OTTk\n6Fx0kb+SPHzYFbNXrbJJuVrOZ0zLYsx27HDG2EKeYEwG5s715+2111zKddkyR9cH8ZhZrI2q4J0K\nU9Vj0WUfMAnYD1wH3Bu13wvcEF1fDzygqiOquh14GbhKRBYDM1U1ziDel/hNktZDwNXt+EkKwe7d\n/p7Hnj2wcKGj57t4Y8OyaJFTbL60li61MSyqbvEvW+b62iTD8vOfO4GK59MHBw+6v/PmOeXx1lt+\n9HbvduO1aJGdYVm40D8qSI7/rl3+O6beeMP1cckSfxnYtcvRspCBWDatZCA2VIsW+a+1eD6XL7cz\nLBayWRW8DYuI9IjIc8Bu4Ieq+jNgoarGQ7AbWBhdLwGSwzwILM1oH4raif7uAFDVUeCgiMxrxU+s\nvPv6nPLwFdJYeVgIlbVhWbLELbg9e/wM6MGD0NMDM2faLN5du+wMS6w8LrjAfy7j6FPEpp979ji+\nLOYzNuwW/YwVUV+fi0DffNOGnsV8WhuWePytZGDWLEfTd8zeesttULDIdIxHwzLZl4CqngLeKyKz\nge+LyEdSn6uIeJb88mHdunVs2gR798LAQD/nn9/PW2+5SSmD48dd4WzOHDtjsHgxTJliR6u31wnD\n/v2wYEE5WrHyBtuI5eBBeOIJP1pvvQXz5zsh3bPHeZank6cFsXfv2BhZG5atW/1ovfEGXHGFDV+x\n0wFj0VQ8v0Vx7JjbQDFnjq1hmTnTzrD09bmND2+9Vb6fSRmI15oP3nrLrbV9+9y680HSsPjKwMDA\nAAMDA34M5YC3YYmhqgdF5O+AK4DdIrJIVXdFaa54moaA5YmfLcNFKkPRdbo9/s2FwE4RmQzMVtXM\n423r1q3jz/7MhaD9/S7l4XMQLl64Ik65+YbbsRczfbq/UMW0YKyfZQ3Lvn2OBtgZlkWLnED5ppv2\n7nXF3unTnRE9fNgZ0jJI99NHeYyMOMM5b56j5XtIct8+t8YsIpakkpw/308Gdu1ytETcevOtc8VK\n8rzz7AwLjPWzrGHZv99lOMA2YrGQgV27XL1s6lTnlB486Ax9GfT399Pf33/6/fr16/2YawHfXWEL\n4h1fIjIN+DjwLPAIcEv0tVuAh6PrR4CbRaRPRFYAK4GNqroLOCQiV0XF/M8A3038JqZ1I24zQEsc\nODCmPObP9/MW4jQY+BspGFu8VrTixeWrPCyFanTUKf+5c91r//7ytODMKOOCC/yMXtKw+HqlcSQ1\naZKj6dvPeA5mzHA1kaNH/WmB/1pLOiwW/XzzTTf2FrSShsWin/Ha8DXuqmPrY8EC/4glOQcW0VQV\n8I1YFgP3ikgPzkjdr6pPiMizwIMishbYDnwaQFU3i8iDwGZgFLg1Ov0JcCvwTWAa8KiqPha13wPc\nLyLbgL3Aze0Y2r/f7cYAf4X75ptnCpWVYZk61SnfkyedYiqDAwfOVB4+izcpVHPm+G0DPXTIRRQ9\nPTZjtnevm0fwn89kP+fOdWNYFkmlZmFA9+1zdOLoeN8+59WXQVIGfBX4gQNjDoxvP1XH1m1fHxw5\n4icDe/acHbWXRdIYn3++X2rz4EEXYff1ubn0jVjSc+CzbquCl2FR1U3A+zPa9wEfa/GbO4A7Mtqf\nAS7PaB8mMkx5YKlwkxPqG/0MDztvfvp0pzxmzhxLpZRBUhAsIhYrhWupiOBMwzJnjh9vaQPqc14k\nbaQsIpYkbwcOuB1FZZCeA5+1YUnr+HG39qdOde99ZSBOH4JtxOI7n3F9Bcb0hk9dJDkHvjJQFc65\nk/eWKaJDh1xREPwXbrw44sXlq8DT6Q7fiCWm5btwk0IwbZoTqLffLk8vKaSWhsVXeRw8OLY2fOfy\n1Kkz8+a+/bRMhSXn0zL6Ads5sDAs8ZjNnj22Nb0M4jQYuJrIlCkuQ1EW1s5aFTgnDYuVwrVcuEm+\nwH+BWNdY0t6yBV8ifv1UPTvK8BH4NC2ffibXxuzZY4cSy+DQIRfJTp5sw1s6areMWCwNy5w5fvSS\njp+1DPiss+T4g20WIEQsNSHtYfkstizDUvZeSd0wLE2PWGLeyvbzyBHn7fX12fBmaViSSm3SJFd0\nL6uMkkrNgrekcbc2LD4ycODA2JjF9HwjlniHoHXE4rs2kjsXZ80qvzZGRlwKccYM9z4YlpqQVLiz\nZ/vdHDBpWPr6nAIp+3yLtGHx8dZUz0yd+PbTUuFmeWtlBf7wYZeHj9HUVJgvvaRSA3/FlpwDyxrL\ntGkuCi2b2rRMhcUyEM/BrFl+MpA07r6psLRh8ZHPuI/JFHpIhdWApFDNnGlnWMBv8WYp3LIL5PBh\nJ+S9ve69bz+zUmE+XqmV8kifWbH05C1TYeCX7shyOqz66atwLeczff7CZ8yOHXPrP45mfWUgq8ZS\nVgayIhYfvZFOH4aIpWKMjLjdV/E2TV+hsjQsSWEHvwWSpjVzpn9xMO5nb69LP5U9R5EWBB/erCOW\npKHyze+n14YPPUvlEctAnDqxWBtJ3mbNKk/Psp9ZsmnVz74+JwfHjrX/TStYGxarTEeVOKcMS3rn\nle9iSy9eHyFNe6WWtHz7eeSInQLPMnpHjpSjdejQmXz5poiOHBlTuDNmOAU8MlKet6Ty8Omn5fjH\nTkIsA9aGxYeeJa1kjSum5eNEpufAJx1mWWMJEUsDkFZETUqFHT58tiCUVUTpFJFvPw8fHlO44KfA\nuxmx+PA1MuLOEcVnKERcn8vOQXptzJjRjH6m15mlJw+2hsVnzJKFe7BxrpIy4LMzrJupMB+9USXO\nKcOS9jpmzHDhbNltoJaG5ciRM09S+whoWgisI5YZM8qnwtJGz1fhWkUFsfFMHlKzNCyW8+kz/mla\n553niu1lZSC9k8vXsFjRyhp/X+fKyrhbFu/TY+azZqvEOWdYkkLV0+POBzRVefikTpK0fITqxAmn\ndOIiaEzPqp+WEYvvmCVp+dLLWhu+Rs+ClrUMHD1qO59WjoJljeXECXdrmSlTxtqsU2Fl5TM9/sGw\n1IC0UEH5SVW1XSCWCreVV1rmeRQxLStP3lIRpVObPnyljZQvb5apsKyI0cqwgJ/j8fbbbgdiklbZ\nfh49ahe1p2ssPjIQr9m0DJSNGi1rLJbjXyUmhGEpMxFHjrh8fLylN6ZlZVh8FVHaKz3vvHLKyNqT\nt0z5ZaXVLBWuD72s4rFlNOtDK33zyrK8nTzpvPmkJ9+UaDZdY/GpmVnLQHrd+uiNY8dcxGnBV5U4\n5w1LWW8t7XnHtCyFytorLWtALRVuN1Nh06a5A6plvFLLiEX1bO/bMprqRsRSpp/Hj48divSlBdlj\n5kPLqp/pVCQ4PpsYsUyf7nYz+j5yvds45w1LWW8hPaE+tLJ4szRSPrxlCVVTU2FxZFZG4C37eeKE\nu69X8nbvTa2/QfmoPe0tQ3OcK0v5tI5Y0obFJ62WngOR8tmJKnHOG5aygpAlVE1NhYFfxNLkVFhW\nlGGV7ijLW5ZSs+zn9On+NTML3qz7aVljsTR6llG76tnz6RP9ZM3BeEiHBcPSAtYTWkUqzDJi8cnJ\nJ8fNcruxD70sI1V2Pru9NuKdXGVOfnfbuWpKjcUyYmklA2WMwdtvu2h2cuJJVz6GpdUcBMNSIbKE\nqqyAZk2ozwLJ2slV9oxNt2ssZRdu7JFa5eQtjYGlV9pthRvTs+pnWaejlfK2iljiesHoqA1vllF7\n2XTT22/b6o1WTkzTd4ad84al7KRmTej06eVonTw5VgiNEXulZehlFS5jQ1UUlqkwyx1JcHaNxYc3\ny+K9tbB324A2IWI5efJspRvXC8rIQBZvZeXJ2ulIrw2fmkhWP0MqrGJ027CUVd7x4uhJjbZllFFW\nqCyL2q3Gv6xXaqlwLftpnZ5opdis1kbZddtkGbDkzToVlhWxHDtW7m7J1nWuquBlWERkuYj8UER+\nJiIviMhno/Z5IrJBRLaKyOMiMifxm9tEZJuIbBGRaxLtV4jIpuizrybap4jIt6P2J0Xkolb8NDUV\nlsUXNEN5WHprWZGUiN8cpCMgy7MKTShqx9GslVdq6VxZRgXpNFgMS+PuE7FYpsLSa2PSJHdnizLP\nsZmoEcsI8Huq+i7gA8B/EpFVwBeADap6KfBE9B4RWQ3cBKwG1gBfEzmdkb8bWKuqK4GVIrImal8L\n7I3a7wLubMVMVirGOmKxNix1K49WqTArgwflDYtlkbzbxfuyNbOjR7M9ecu1YTn+lpsKrHlrgnOV\nxVdMz0oPnfOGRVV3qepz0fUR4EVgKXAdcG/0tXuBG6Lr64EHVHVEVbcDLwNXichiYKaqboy+d1/i\nN0laDwFXt+Knqd5aK6GKb0NhQa+sgFqmiFp5pWV4U20dGTSx9tDT406oF33CaBVORxOidsu1AbY1\n0G6nScFWD53zqbAkRORi4H3AU8BCVd0dfbQbWBhdLwEGEz8bxBmidPtQ1E70dweAqo4CB0Uk8YTw\nMTQ1v2ztrVlHLN2sscS8Fe3niRMuhZA8hGjNm6VSK0svK5KCZkSzTY5YWhk9qw0slmNmTa/smFWJ\nyZ2/0hkiMgMXTXxOVQ9LYr+pqqqIlHzIZzEMDa3jv/93dw+n/v5++vv7S3sxWRM6bdrY7RTSCq8d\n2glVUd5Us1N+lvlla8NShresIii4fpfZOtsqAi2r1KwMi3XtodsRy5QpY3cDLiIDrfpp6fg1YVeY\ntWGxzJwADAwMMDAwUO7HBeBtWESkF2dU7lfVh6Pm3SKySFV3RWmuPVH7ELA88fNluEhlKLpOt8e/\nuRDYKSKTgdmqui+Ll0mT1vHf/tvY89vBb0KTT2mEMwvRWV5mK1h6a8PDTqCTN8eE8gIa5/jTfJVJ\n0VmmO9pFBbt3n91ehp5PxJJl9MrQa5U6KTsH3Y7amyADYBuxZK1by+3GMW9F6bVKB0+fDm++WZw3\nGHO4Y6xfv74coQ7w3RUmwD3AZlX9s8RHjwC3RNe3AA8n2m8WkT4RWQGsBDaq6i7gkIhcFdH8DPDd\nDFo34jYDZKLbQgXlvAVLoWqXbrLyiKZOdQasaCHasp+W6SbIFvgmpMKs+2m5Fb1dvcAqMrPMKFj2\nc+pU99TRorfVaRdpF+Ut6550MDFSYf8G+N+A50Xk2ajtNuArwIMishbYDnwaQFU3i8iDwGZgFLhV\n9fTu7luBbwLTgEdV9bGo/R7gfhHZBuwFbm7HUPKBVeC3cK2E6sgROw+3iiKoiBOst9/O/l+tYFlj\naadwy3jylhFLuyjDqp/TphX3SrMe2laWr5i3hQvPbrd0iMrQOnXKOT7xY6ZjdCMyO3r07NsKFaUF\n5XaFWTsdVcLLsKjqP9M66vlYi9/cAdyR0f4McHlG+zCRYeoE69ymFb0qUieWEUuStyKG5ejRs9OH\nSVpF+bIUqqw58KG1YMHZ7dYG1IqW76HGLN6KrrWsM04xraK8HT/uaj3pLdrWsj5tmhtTC8NShjfr\nNGmVOKdO3lsKleUCqSp1YrmLpczizdpUUJa3VsZ42jS7+eztdXnskZFitCyNnnX0Y2UIYnpWMtVq\nbVgbY8vsRN2O33iOWM4pw1KVJ1/G87AS0Cq90jJCVUXxviitkyed8Ug+CRHK3xXAUhFZGvZu1KWq\nSOFaefLdqKdazYF1xBIMS4VoFc6WuU+PpQJvqkcU89Zu3Iry1sSi9vHjLh+fvOtyU3irkpaVDFg6\nV02I2lvJVBkZaGqmo2qc84Zl0qRyJ6Itd3c0VRGpnn3X5W7wVsYYt1NEVl5kTK/u9JWVYW9FK75X\nVVEZsIwMmlpLarWlN+at6FqzrM2GiKUhaKU8yk5qEz0PS4/o+HGncNJFUB/erNKHlmPWai7L0rPm\nrdtGCuqvZVg7HVbrbHi4tQyUNe6top+6U5tVYkIYFmvF1sQ0QLzF9MQJf1oxb3UKgmXxvhWtsrw1\nNeXXaT7r9Jir6GcsA0U2Y1hHs9ap5RCxNACW3pp1GsByI4CVkrSkBc1N+XVDeYyn4r01b02XgSL0\n2kWz1lFGiFjGKVottqamr7qR7ijSz3a0rAuX1p5fkUJ0VQq3qbSg/pRTU/vZjWjWKhXWaVNBmQeH\nVYVzyrBY1liamiu1THdYRyzW5zuyaPX2umJ0nemOKs6xWO7Ki3lrojFoggxUEbFY0opv81Ik7V01\nJoRhKTqp8bmH9K0xytCCanLyMb0ivFXpyVsptTK8VZkKq1t5V+F9133+qp1DVHfEYmlYrB2/KhEM\nSwbixZF17sGyeGwp7DFvloaljIdlWXto18+itaTxlgorcyNQyxTRyZMwOprtXNW9GcYyYrGWgVZr\nzTK1HPMWDEtFsDQsVso7ptft2kMZ3iw9ItXsGwOWoQXNjliq2C3V0+PGssjZE2uF29RDpZ2cK6sN\nLNZOZIhYxiksFW5VeVfLQrR1xFJk4cY3BsxSRNYGtIxhsRLQkRE3X+nn4ZShBbbKw9qwVLkZxlIG\nLI1xE2ssMW/BsFQEyxRRFRFLb6/zTK0K0ZYRi3W6yersT0yvLgNaVV2qG7w10bmK7wowPOxPqwxv\nnfoZaizlcE4ZlioWW1EBbfXsiCQ9K++7zohlPCvcJhZ7obhis45mrdbZqVNuB5OVDFjXGauIZrsR\nsRSlVyWCYcmApYC2enZEjDJC1cQaS7sxmzKl+NP4LIv3TTVSYLuxoB1v8YPbLPgqKwNZadKYnuX5\nq7r6mWfTT5GUX4hYGoImemvthABsd7HUuSus3ZjFT6S0zH3XtSusGzvM2ikPS4eo6PhXJQNFeWtq\nxNKun5Mnu5flLZeCYakITfZiWmEipMKazJt1KqyIk9DuzrpleatCBopGP1WujTplvR2tsvRCxNIA\nVCEIloujDL2mFu+tlYd18d4qKmjHV5xbz7sZ48SJsVPUrXhrao3FKvosy5ulrFtGLFXJ+jlvWETk\nf4jIbhHZlGibJyIbRGSriDwuInMSn90mIttEZIuIXJNov0JENkWffTXRPkVEvh21PykiF7XixcqT\nr+oQItRbY6kq3VQ3b9YF8nYpvyL9zDNmdUWzVUbtRdOkneTTyuh1I+VntUmhzE7LKmERsXwDWJNq\n+wKwQVUvBZ6I3iMiq4GbgNXRb74mcrrUdTewVlVXAitFJKa5Ftgbtd8F3NmKkSYW75ueBqgivwz1\ne5KW0Y+Vo9DJw63b6ajCSJXlrYr0lbUMWNfMzuldYar6T8D+VPN1wL3R9b3ADdH19cADqjqiqtuB\nl4GrRGQxMFNVN0bfuy/xmySth4CrW/FShVBNnepSGHlvtTGeayx1FWjjJ1u22p5qmaYr40VaKclu\nrI0qdoX19bnbveTd5deNNGlVxfs6097WZ4mqRLdqLAtVdXd0vRtYGF0vAQYT3xsElma0D0XtRH93\nAKjqKHBQROZl/dMqvBiRYo86tlREnYq91gJqdVK7KG/tnmwJza09FOWtSsNiuSusaMqv6VG7ZZrU\nup/jtXg/udv/QFVVRCp5csBf/MU6zjvPXff399Pf3w+UE6qYThbiBdJOwSRpWSmiEydcobdVsdda\nQIeHnTFrdf4gL62ivFW9EaCuiGW8poiS9GbM8OML6t1ckycDUIcMqHYnYhkYGGBgYKD4DwuiW4Zl\nt4gsUtVdUZprT9Q+BCxPfG8ZLlIZiq7T7fFvLgR2ishkYLaq7sv6p1/60jpmzjy7vcxiO//81p/H\nnsz8+floNVXhtqPX0+OihuPH2//PGFWmiOqsF1hHLJ2ivP3pJHMHepYKd9as1p8XMQaWaVKwTYW1\nW7eTJ4/dcinrLs9F+ILiTmT87KFWtMoYlqTDDbB+/friRHKgW6mwR4BboutbgIcT7TeLSJ+IrABW\nAhtVdRdwSESuior5nwG+m0HrRtxmgExU7a3lQZXFXstUWMybVT+L7PyxLmpXtcMMmltj6YYMFJnP\nqtLBlptEwDa1aR3NNjkVZrHd+AHg/wMuE5EdIvLvgK8AHxeRrcBHo/eo6mbgQWAz8PfAraqnb3Jw\nK/CXwDbgZVV9LGq/B5gvItuA/5Noh1kWJreIv6y90rrSHVVGLDG9OoSqyn729rqNGHnPnnSaz7oU\n0eio60fWfaqK0op5s5IBS1rDw+09+SY7kXWNWR3wToWp6m+2+OhjLb5/B3BHRvszwOUZ7cPAp314\nrHuxdfKI8qY7qjzZW5Re1d6alWERGYvMWinlNK3Fi214y2Okio5/q1qA5a4wsF8beTeKWKfVrDMK\nVclA04v359TJ+1aw9uQtU0RN9eShPqGqMkVUlDfriKWTYbccf6tdYTE9yzRpE+tvRenlcdTqSntX\njWBYMlClUNVZY2lqusNSeZw86dJcU6a0/k5TDWg3xj/v3XWrjliKbN+v6qxIUXqWDql11F41JoRh\n6e11AjU6mu/7Td1Sal0ErbKflsX7omPW6hG7Zek18RxLJ1rJHU556bXrZ11RRpUbAWJ6dTkdlhtY\nqsaEMCwIKoFZAAAgAElEQVRQr/dttUAsDUGnGyAW5a2pyqPT+EN9c1Cl09Fk3qzTTUVkYNKk1pt+\noHiU0cRNP3UgGJYMNFWo8tLKk+7oJATd4i0Pqtx5VZQ364jFart3pzEDe+eqju3Gees1eWSgG2sj\nRCwOwbBkoKmF6E6LLfa+8jxMKI9QnSsRi2U/q3Y6LA1okfRVlf0smibtlPKbNCmfDNThXNWxzupA\nMCwZaGoh2tLDqlqounFSu4leaVONcUyvrjpXVamwmF6efladPiy6m7RTjavIzXCrRjAsGbDOo1dV\n7C3CWzeEyjJ10o5W8nYzeWhZR2ZVbU+tM+U3XtPBRejlNVJ1rY12/Ywf993UqGXCGJa8k6DqTve2\numU7NLf2UISedVG7ycqjaq90vI9ZTG88RyxWzlWdZ9YsMwpVY8IYlryTcPy4O/PQ6pbtRWhBtTWW\nIrwdO9beeBahFfM2UQxoVQq3r8+dw8mzTd7SsMRnf9rdeNEytWlJC+qL2qussUCzC/jBsKTQjd01\nTfRKx3Pxvgi98VxjKfLcE+sxmz6989kfy11hVrRiek1NB4eI5RyDpYdb1PPIU3uouhCd53b4eWmd\nOuUKie0iIMudP5BfgVvSOnnS9bPdKf460zqdaOWNDJrsXFWdCitaY7Eq3lvPQdUIhiWFqoWqSCHa\nOkVkaaSmTKnudHsRet0wxu36aV1wz6uM8vYz74aHpp5xytPPvAa0jlSYpQyEVFgD0FShgmLed9WF\nyzx8WW9drtqAFulnlYoopmcVmTV1w8PUqW7DTJ6ts9bbjTvVGfMa9ry3hwkRyzmGOnaKjI66V6en\nz9WVR28irbz06jAGVdelrHmzTgfnVbid0q4iLuKt+uyJZTq4G5t+QsQyDlCHt5anCAq29YIigpDH\nW6uaL2t6lgJqHc3m8b7rmANLGRge7nxPuphe1YalDlp566khYhknqMNby7PYitBrao0lD60pU/Kf\nFG6q8rDeAtpUY2C5EaAbMtDE4n0eWj097k7rdaTkq0YwLClUrbyhHq+0alrxSeGqharqGlf8FMpO\nt6fPs5Mu5s2qn3nHP68MWEUYMb0mrltLgwf55zOcYxknOBcilqo9LEuDF/NWtVBVHRXk5S3PTrqY\ntzqcjqbKgHXEUqVhL8pbiFgqgIisEZEtIrJNRD5f9PdN9YhgYkQsTeatDgOa18NtasrPUkFCsWg2\nT2RWdfG+yc5VHRgXhkVEJgF/AawBVgO/KSKritCoS6g6eURF6FnvYrG6pUteoarjfEEdSjKPwDfd\n6WhqxFKkSG5FyzKaDRFLs3Al8LKqblfVEeB/AtcXIWA9oXl2d+QxBNDciKUbnnwngS9Se6g65Wep\nPJqcOqmjznguFO8tI9CwK6waLAV2JN4PRm25YTmheXd3WApVnvMAeWnl5S2m1cmAWvYzjqTy1B6a\n6n1bRyyWxXurMevtdU5Apxtkjvc0aR0GNM9hS8jvEO3bl+9GppZo87TnRiHHzm9Yt27d6ev+/n76\n+/tPvy+yQObO7fy9mF67ybdUHvEz6tsdwEry1Ql5eEs+ja/d/bEsU37dSClYRixWXmmRfh4+3Pl7\nlimiY8dg9uz230k+D2TmTD++oNh9zKwchTzp4PiuAKrtnR1Lp2N42BnuPGd/8vSzvx/uvx/e8x4Y\nGBhgYGCg8488MV4MyxCwPPF+OS5qOQNJw5JGN7xSy3RHHg83j/Iu4uEWMQbtDEvelJ91iqiJ6UOw\njVimTYM9e2x4K9LPxYvz8Xb8uI1hqaMukodWT8/YXQHafdfS6bBOqyX7mXa4169f35lACYyXVNiP\ngZUicrGI9AE3AY8UIVBHEa4uI2W1ESAvvSJeqVX60DJF1NvrPNJOZ08sBb6OfjZZBvLQiucnPivk\nQ8uaN0taltvai/BmiXFhWFR1FPhd4PvAZuDbqvpiERqWh+Agf73AMmKpOkUE9t53HUXtTvTyPvfE\nUuAtI7P4YWCW96Sr2oDmHf+8W5etDUvVMmAdseTJTlhivKTCUNW/B/6+7O/r8mKs0leWEUbMm2U/\nFy2yo1X17hoYMwazZrXnzXKTgmU0a7nhoakRSzfSak2sDVpHLHnXmiXGRcRigSJCVYe3FiIWh26k\nASwL7lWfY7FcG5a7wmLeLNOkVuNvnQ7Oa9ybWGPJu8PMGsGwpFCHh1VXjcXKW2tqKixvigiqn4Om\n0oL6IpYqt+9b06vDucpDK95N2mmHmTUmjGHJ+zChuoTKaldYk4XKsnhfhK9OKaKYXp45qOPkvbWH\nm+dcUhNrLHUalirvpFDHOrPGhDEsee+uW0SoqlYeVkKV93R7zFuVRq8OYYd8c9BkpyMPrcmT3evE\nifbfa2qNpUgqrNOYnTrlHE3LGksdZ5zy1PKqLtzDBDIsUL0gNHVXWN476+alV4fysDTGMW9Ve6VV\nOx1QfY6/qanlJstAiFjGGar2POowUnlutVHUk89zC/imeriWEUtdCtc6MutEr45t1XmyCUW2G8en\n5VuhyE6pqjMKRSKWTvcsDIalAtThSVqmm/LwledMRpHw2LrGYkWrr88Zz04GNI8ignwKvK5zLCFi\nKUarp8etj3aGynrM6jh5H9+zcHi4Pa1gWLqMTpOq2tz8sqUgdEMRFfGwLGiJdDbudfazyrRON5Rk\nU2WgiKNguTaauOUeOjsxwbBUgE6TeuJEvpu/5aEF9jl5qyjDOnVyLhjQvCmiqnPfeXYzWo7Z6Kjb\npp1ni3aTU5udjEFdTodlyjUPb6F4XwGa7Mk3VeE2tXifh16T+1kkMutUfyhqQPOMWZ6idpOdjk79\nrCsdbJlyhRCxNAKdJsFSqUGxorZlES6Pws0rVJapmKp3cllGLHmfh5OHVlHeOvXT2pO3lIFzwenI\nuxW96rpUHnrBsFSApnq43Sg2tlMeRXbEWOeXqzx7UlThdvJw+/o6Pw8nDy1obgRqOWZFeOuGMW6i\nrDfZgFoiGJYEurHYikQGlsagqn6OjDhvfnKO25nWoXDzCqhlSsG6ZlblJoUmRywTpXhvudaCYakA\neVIKlttTm+phWS7c2OBVnZOH6j35OhRuTM/S6FlFLFVv37eMpooY9k60rDc8WK61ULyvAE3dnhrz\n1kl51LErrOoor4hQVRlldCNisS6450FTayx9fS76PXnSn1bMW9UZgKpP8UOIWBqBKr3SvE+7y0vP\nUoFb7oipU+FWbUCLro0qN2M0scYyOuq2SeeRgTwHe4s6HVUV74uOf6eNOqHGMs5Q5U6Rog/XsfQ8\nqjQGdUZ51orIaudVb69TlO0eddzUKKMbdYw8njw0VwYsaVV9V4BgWCqAZa7aekKbKgiWtKwVblMV\nUSd6RbYuQ7Xed12HEGN6VRu9vLSsarN5eLNOB4caS5eRR6jqCkGtc/xNjFigucbd8oxTJ3ojI85z\nzbOTDuzHzCr6sVxneeg1tXjfZCeyjscSg4dhEZH/VUR+JiInReT9qc9uE5FtIrJFRK5JtF8hIpui\nz76aaJ8iIt+O2p8UkYsSn90iIluj12+V5Req9+SLeAqWC6SpEUseek09eW/ZT2uF29QaS91ORxO3\n7+ehV9cGFkv4RCybgF8HfpRsFJHVwE3AamAN8DWR01nWu4G1qroSWCkia6L2tcDeqP0u4M6I1jzg\nS8CV0et2EZlTluGmKjWodleYdfG+iAHN00+rOajz1hjt6DXZw63TGFtmFKpOH1qmwiZ0jUVVt6jq\n1oyPrgceUNURVd0OvAxcJSKLgZmqujH63n3ADdH1dcC90fVDwNXR9SeAx1X1gKoeADbgjFUpdCMN\n02p3x7miPLqRCmvFW3weIO9OuqqNlJXysPbkLZ87Y3mWq+6Ipaoai6UBVZ3ghqUNlgCDifeDwNKM\n9qGonejvDgBVHQUOisj8NrRKwdKLmTSp/WNez5VdYfGDw1oV3C37GRuCvLuImmxALSOWqs+x5KXV\n19f+oXJlotmmFu+rSoUND+e/wzo0t3jftnwoIhuARRkf/aGqfq87LJXHunXrTl/39/fT399/xueW\nqZOY3rFj7hGnaVgutqK7iCwFIfnck6xIwrKfZca/ytpDnRHLvn2tP7fu5+LF+Wglz57MnOnHV8yb\n5c02rdLBU6aMHd7MUvhl9UYWrNNqab0xMDDAwMBA/n9QEm0Ni6p+vATNIWB54v0yXKQxFF2n2+Pf\nXAjsFJHJwGxV3SsiQ0B/4jfLgR+0+sdJw5KFPIqozKTOnZtNy8rDjb2YPDdATPLVCmU3FsyalU3L\n0rBY7bwqyltvrzPgIyM2BrTJEUs3vG8Lw9Kun0Vum5LkqxWKOlfxowvOO8+PVifeup1CTzvc69ev\nz//PCsAqFZZMXjwC3CwifSKyAlgJbFTVXcAhEbkqKuZ/Bvhu4je3RNc3Ak9E148D14jIHBGZC3wc\n+H5ZJvN4RHV6pVUttqLpK0veqixqF5nPTie/mzyfdReiq5jPMmnSquoix45lG5x2vDXRubJEzp30\nZ0NEfh34c2AB8Hci8qyqflJVN4vIg8BmYBS4VfV0iftW4JvANOBRVX0sar8HuF9EtgF7gZsBVHWf\niHwZeDr63vqoiF8K1kLVjl6Z/HKrBVL0RnLd2K1ThfKoc3cNjPUzKzIrmu6wHrNWtE6dcnW+Irv8\nqlK4lv0sM/7WkVmn2mARWk10OixR2rCo6neA77T47A7gjoz2Z4DLM9qHgU+3oPUN4Btl+Uyi6Xn0\npi62TrzNn5+fVlUKtyy9dv208kotlffx464GYLXhoU4Z6BQVWDsdVs5aK2ekFSz72dTi/YQ6ed+t\nGksWrHdL1WlYmhqxdOPkt1VRtaoxq3ttWPNWV1Hbh57lppO6095WmFCGxfJGgzB+IxbL1Jplys/S\nsI+M5L+zbh56dXvyVW0EqFMGOqXV6kyTVrU2LGkVPRNjiQllWOKdP6323Z8ryqNKoWqy51ek2AvV\nRiyWhr3ImE2d6nYZnjqV/XnRQnRVqU3LTQVleLM2elWss+Fhd9Yu7z3pLDGhDAs01yu1jArGayqs\nqIBa8tWJt7rXhpUiEnE1mVa3bbfc4WRdY2lq8b6pEUtRWpYIhiUBa+VhuSvMchfR8HC96Q6rnT+W\nfFnzVlX6qmw/m2pAq+ArlgHL4n2dhuXYsexbSwXDUiGqCt3rrLFMneq2oGY95jVWkEVSRE1XHllC\nVXfEYr0N19KwNDUys0xFxjKQlfKL+cp74BiqS+EW7Wd8cDrrlkvBsFSIVpNaptDVaYFY5aqPHi1G\nK3lSOIuvoovN2vu2ohXfr214+OzPigp7J97qPjhYRcpPtf7zOlZp0nYpvzIyYJ3CtUxfteKtqA6y\nRDAsEeLzAJZeTJ250naLzVqo6vLWoLWQFhV2a946nT0pM2aWkVmWMThxonixt6m1pHa8HT1qt87K\n8NYNGcgatxCxVAhLhWt5mwdLbxlsvRjr3VJVpHW6UWOpK2KZNMmlPLIiM8saS91Oh2XxPubNSuE2\ntXjfjl4wLBWinXW3zFUX9YrabQMtmgprx5u18ijKW1VeqaWRGh11Oeysu1i3QlUFd8t+1m1YrNdG\nVQbU0ukIEcs4RTtFVOdi6+mpJidcJg1QZbHXSqgsI5aYr6IbHqxqZjG9phqWdkqyaNTe1NpDU4v3\n7egFw1IhmurJd+KtTPrKMuVnpSQtt/RCNfNZ1uBZKw/LSNvKw23XzzLRrKXTUYVz1Y1NP8GwjENU\nZVgsFbilIFj2c2TECZbVbVMslYdlxGLtyZdxOto5Cla06o5mq6wzWsnmyIjLNhSRAWunI6TCGgBr\n5WFVvG9Hr+40QDuDd955trdNsfK+604RWXryMW/t5qAorSZG7VOmtD57Undk1mSHNEQsDUC7SbBS\nRKdOFb/RI7Q3elbKo6nRT1l6lkXtbkQsrU5EW0YZdRuWrDGLz8QUPXtShXFvqtNXll6IWBoA6+J9\nO2+5iCffjremGgPLlA7UH2VY0po82W0TzjoRbTmfZWl1u8Zy/Lh7jHDWM+I78dbE+bRMucaHl61u\nwxIilgagqekmqCZNV7dH1NvrbjWTdYfpphq9sgJqnb6yimar2IZbpo8xvW7LQN2OWk+PM7rd3gEa\nDEuFqEJ5l1m4nehZ1UWs02pFabVLd1imr44csVXeZeYzS4HHEUxfnz8taEYqzNq5styZZxmZWa6N\nqhy/cEuXimBZY7H2cC0X74wZTrla0LIWqqqMe50KN6aX7mcTnI4qaizW/SzD23nnOT4saFmvjSqi\nxnEZsYjI/yUiL4rIT0Xkb0VkduKz20Rkm4hsEZFrEu1XiMim6LOvJtqniMi3o/YnReSixGe3iMjW\n6PVbZfmN0dTaQyfeitJrJVTW+X2rfpZ92l1VUV5RvmJ6ad7Kjpn1VvRu11i6kQ4uOgczZrQ2LJYH\nVK0MqI8MnEvF+8eBd6nqe4CtwG0AIrIauAlYDawBviZyuox9N7BWVVcCK0VkTdS+Ftgbtd8F3BnR\nmgd8Cbgyet0uInM8eG5bcG+qJ19GeVhGLN3w1tL9PHHCpcmKnAeIeWviNtxWvJVVuFU4HWXrNVYO\nDNhHLFkyYF1jKeN0ZNEru+GhXZp03BkWVd2gqvGO86eAZdH19cADqjqiqtuBl4GrRGQxMFNVN0bf\nuw+4Ibq+Drg3un4IuDq6/gTwuKoeUNUDwAacsSoNyxB0+nS3GNL77i3zrmW2bYKtYWn1fBfLiOXo\nUZg5szitdkI1Y0ZxWt2usVgXtcvQa+fJl5UBq7XR1HRwN5yONL0m1GusYFVj+ffAo9H1EmAw8dkg\nsDSjfShqJ/q7A0BVR4GDIjK/Da3SsPQ8enpa59GthKrMrczB1itt9XwXH4Wb5q1MsR2aW3uI6VnV\nWCyL95YKt6cne91apsJOnix+E1CwN6DdLt43oWZphbbqSkQ2AIsyPvpDVf1e9J0vAidU9Vtd4K8Q\n1q1bd/q6v7+f/v7+s75jHbrHQpr0ji0Xmy9fafikKNLKoqwBzRL49BgW4ctK4fb2ughxZOTMlNyx\nYzB3bnHeLBWu5Q5ES8OSpJeMOC3Xbez0FT0X1q6fZdbGqVNum3zSybNOk3Y7YhkYGGBgYKD4PymI\ntoZFVT/e7nMR+d+BTzGWugIXiSxPvF+GizSGGEuXJdvj31wI7BSRycBsVd0rIkNAf+I3y4EftOIn\naVhaYebM7MWWFoy8aCUIZb21vXvPplVmsVnuiIl5s/KwsuagrGFpV5fy2QqdNixWeXTLaHZ01L2K\n3uGhW4YlTaus05G1NsrIZqsaS5l+JtdGkpfDh8vrjbR8VmFY0g73+vXri//DHPDZFbYG+APgelVN\nJkkeAW4WkT4RWQGsBDaq6i7gkIhcFRXzPwN8N/GbW6LrG4EnouvHgWtEZI6IzAU+Dny/LM/QWqjK\nKrYsepaFS5+owFJ5WPN2+LANLesda1kKvKxiy6JluTbiubT05K0MS9nxnznz7LXhI5vd3lhgqTes\nnavGpsI64P8B+oAN0aavf1XVW1V1s4g8CGwGRoFbVU/fvOBW4JvANOBRVX0sar8HuF9EtgF7gZsB\nVHWfiHwZeDr63vqoiF8a1hFLlldkmSttUsRixZulUGUJ+6lTtttALXnzSYVZ1fLaOVeWhqUsrQMp\nCbfMJoCtc3XkCFxySXFalgbU2rmyQGnDEm0NbvXZHcAdGe3PAJdntA8Dn25B6xvAN8rymUaWtwy2\nnsexYzB7dvb328GyoNeuxmK5k6usV2ppWLIM3tSprrBcFFVELFYn0ssq79gZUj0z2vFR4FlpnTkl\nDgbMmAGDg2e2lV0bltuNofXaKKs30nqobFoti6/hYTe3Re/wYIUJd/K+r895tCdOnNnehFSYZeqk\nVcRSdvFaG72sVFjZNICVwYPsfh4+bOdJWqfCyvSzt9cVoIeHz2z3qRdYpcKy1oZ1Ksyyn2V5s3au\nrNasFSacYRHJntSyE9HttI5lGmB42HmpZbwYS++71ZjVHUmBrVfa7W24Pv3MmgNLGbDc2FGWr2Rk\nFiOWgaJbl2PeDh06m7ey8pllQK2cvrK0rDDhDAucLQiqthHLoUN2h/3KLtysyCxebEWLvdB68TYx\nFdaNiMVK4JuQioTsNJGlE9OEonZfn1vrVjIwa5ZdNGVpQLOcjhCx1IC0tzA87FIDRW8nEtPKWiBl\nFVHWAilDS+TsVEBZWtB68c6aVZyWZbojK+VXNq0G3Y9YmmJY0us2TouV8eQtnSvLtRHTs5IB6x1r\n3Sze+/TTAhPSsKS9Bd+Fa2VYLCOWLN58vJisxXvoUDnDkuWt+WwEOHr0zNvqWEcslimKsmOWZaTK\n0gLbtdFKBqzWhqV8+hqWdCrMJ2KxSoX19Z39jKOQCqsB6cXWFMNiGbHA2d68Dy1Lr8gy3TFpkuMt\n2U/LGkvsyVvVpcp68tZeaZYMWNGC5kQs6ZRfkyIWq1RY1jOOQiqsBqQXSDcMS1mvtKnKI+tWOGU9\nZmvlMWvWmZ6kpQH1GbNWxsAnYkkWoq0jFkvD4pMmtar9xPSsnKusGktZBW4ZscDZTkxIhdWAbkcs\nPl5pUyOWtFD55OQtU2FZvB08WO4cEZwtoD5rwzJimTzZRU1p5dHUVFjZfjY9FZZcZ/Edv61kwNK5\n8qFlgQlrWJILxNJbUy1Pb+pUp7CT9YKm1Fhmz3YKO0nLSqmBrVD5ePKWKQXLiAXOnoOyyhu6nwrz\nkYETJ86sF1gaPcsaS7xJpMwOM8sDkuDWVFo+Q8RSMbpZvB8edie+y+Tke3qc95NWbJaGxWrh+iq1\ntFD50LM0LOmUn2V6wpe3LMPSxFRYfOq7jCcf72a0ks901O4zn+nI2IeWZb0Gsh2/YFgqRjdTYb4T\nOnu2XTSVXmw+gmC5cKdPd8on+XCogwfL3QIEbA3L7Nl2KYU0X6p+BrSbUaNlVOAz/mDv+KXlqSwt\ny9rs1KkuKhsZseHNct1aYEIalvQCsfS+fQ3LnDln3oTPh54lLUtvWeRsT9KnLpJW4D60ujn+w8Nu\nF1vZ+zdZp8Is08GWMpCm59PPOXPsHKJ0KuzQofLKu1Vk1gTHzwIT0rCkJ9THW04vXB8hiOlZKrb0\nYmtKqJ1UHqqOdllDlSXwZWmlx99nPqdPdx5pvNHBd21YRizpfvootawx84lY0vJ54EC5B61l8WZZ\nvPfhC7IjPUvDEiKWipGuFxw4UN6wzJ0L+/ePbQNtUsQye/aZtHw8eUulBmdGGUeOuEJ3mTsfpGmB\nrWHZv7+88hA507j7KlzLiGXu3LPXRlnerGXAUj7nzHG8xbDcGenDF5xpqOK6apkHysHZa8NH1i0w\nIQ1LLAgx9u8vv0CmTnUKJF4Ylobl1KnmKElLpQYwb97YHPgKQdZ2Y6sx81UeSXoW9Tcr454lA2XX\nxpQpbjt0vFHB14AmeTt50jkePv20cq6yIhaftZF0/HxpZRljn2jKFxPSsCSVGvhPanLx+k5oWhH5\nePJZSrIsbzNnOsURF9x9leTcubBvn7u2MCzpiMWqxmI5n9apMN/ag5VhgTONge/aSDsdM2eWe7YO\n2DpXcco1jsx89Uayn77jny7e+9LzxYQ0LEmlBjZeabxA9u1zC8aHViwI+/fb0Yrple1nT48ruMce\nmy9vSaGy8NasU2Gx8vAZsyS9mJbPmCUNy8iIi5KtIhZfA5p0rvbt86M1b96YfFpGjDFvZeegt9dF\nZ/GmEwvDYtXPtNPhu259MWENS7ciFkvD4iug6eK9hVcU0/Ptp3XEEvPluxEgTm0eP+7eWyq2vXvt\nDEvMV5nDeXB2ish3baSdq/nzy9NKyqdlxAj+/Zw/381jzFsTDcupU34bkixQ2rCIyJdF5Kci8pyI\nPCEiyxOf3SYi20Rki4hck2i/QkQ2RZ99NdE+RUS+HbU/KSIXJT67RUS2Rq/fKstvEnPmOK82PuFu\nYVi6FbH4GgJLobI0LEmh8jUsSWE/csTl+8sWQcF2DtKOgo/CtRz/+LxUnNq0TIX5GlDriCXpRPo6\na8m15qu8k/20lE3fFLoFfCKWP1HV96jqe4GHgdsBRGQ1cBOwGlgDfE3ktF91N7BWVVcCK0VkTdS+\nFtgbtd8F3BnRmgd8Cbgyet0uIt52eNIktxUv6f35KLZuKSLLVNjwsEuflL0fV5qehfKwKt6ffz68\n9dYYXz7KG87sZ5MilmRk5mtYenpczSCmZ2lYLKJZqzRpcvyPH3eHEn1koKkRS3rN1llfAQ/DoqrJ\nGxLMACLR5nrgAVUdUdXtwMvAVSKyGJipqhuj790H3BBdXwfcG10/BFwdXX8CeFxVD6jqAWADzlh5\nI7lF8lyNWGbMcMI0MjJGq2zqBOCCC+DNN921ZSrszTedcSiLBQvG+Nq71733QXoOLNOkPkZv/vyx\nMfMd/yRvcerEx7inZcCnn5YKd/p0Z0yGh21kIGlY9u2zjVh8aJ1//pgM1F24B5js82MR+SPgM8Db\nuIgCYAnwZOJrg8BSYCS6jjEUtRP93QGgqqMiclBE5ke0BjNoeSMWhDlznAdT5r5GaVpgY1iSysNn\ngYg4XvbutVlsF1wAe/aM8WaV7njzTfiFXyhPa/ZsV1AdGXGRi0XEEjsdvlHGnDnw85+7a98xW7gQ\ndu921758wdi6nT/fP3WSTDn58paUp7fe8qMVnyXav99GBpKG5c03nUyURVIG9u6FpR6abd48l95P\nOpF1om3EIiIboppI+vVrAKr6RVW9EPgG8GdVMGyF2GPes8dvcYBbbHEqxlJ5WHilixY5ehb9tDQs\nSeXhy1tPz5gBtYhY4jmIT0X7nGBOjplvmm7BAkfj5EmbtRErNl8FmaQFtk7H7t1uPnwQz4GFMY7n\nAPzXrWU/e3rG9JCFrPuibcSiqh/PSedbwKPR9RCwPPHZMlykMRRdp9vj31wI7BSRycBsVd0rIkNA\nf+I3y4EftGJi3bp1p6/7+/vp7+9v9dXTi62vz3/hLlkC//Iv7nrPHr+0zuLFsGuX85bfeANWrfLj\nbbb8ScgAAAyvSURBVNEiR+/AAXftgwsugBdfdGmFt9/2L7jHxthCsS1Y4OhZRCyLF7uxj4XdJ3US\n0wJ/xdbb68Y8doh81hm49fDGGy5a8V0bixaNyYBvP+O1oerm4Bd/0Y+3eA4OHfLv5/z58Oqr7kzX\nyIjfeZ1k9LN7t4187tnj5L0VrYGBAQYGBvz+UQ6UToWJyEpV3Ra9vR54Nrp+BPiWiPwpLm21Etio\nqioih0TkKmAjLoX254nf3IJLod0IPBG1Pw7cERXsBfg48PlWPCUNSycsWwaDg86w+Cq1eOEeP+68\nXB+PeepUlxfet8/RXLzYj7fYsBw8aLNwf/Qj2LnT0Sp7aA2cMR4acsrDQknGdRYLWosXw8svO1q+\nTkfSsOzc6T+fF1zglNDOnfDhD/vRWrLE0Zk+3X9txLSGh91a85GBGTPc2jp0yM2BL29Jw7JkiR+t\nBQtg48YxZ8jH6Vi40PEVy4BVZNbOsKQd7vXr1/v90xbwqbH8sYhcBpwEXgF+B0BVN4vIg8BmYBS4\nVfX0A1VvBb4JTAMeVdXHovZ7gPtFZBuwF7g5orVPRL4MPB19b31UxPfG0qXO8zjvPBvlsXPnmOLw\nWWww5km+8Ya/IFgblj17XD99+Zo50xn1/fttjMEFF7h+Dg76K9zFi+Gf/snGi4wj0OPHnWLz7Wec\nprNYG0uWOBmYMcPGsAwNOb4WLXI7L8tCZMzxs0iFJQ2Lr2FfunSML9+5nDXLbY3fv9825bdrF6xc\n6UfLF6UNi6re2OazO4A7MtqfAS7PaB8GPt2C1jdwNRxTLF3qlIeFUMULd2jIX9hjert22Xi4ixbB\njh0uFfahD/nTGhpyL59CY4zly2HbNmf0fIVqxQrYvt0J/bJlHb/eFvF8Woz/tGkuCt282a0NnygP\nxhwFC+O+dCn88z87I2+RDn7jDTf+VmtjcNBmDhYvdgb00CF/p+Pii+H1192GjAsv9KMFrp+vvOIf\n5YFbGzt3jhn3OjEhT97DmEf0yit+O5JgbFfZ88/bCNXSpa6Wcfy4f7Fx2TInCK++6pSvD1ascEZq\n+3YbA7psmVNsy5f7K9wVK+C11xx/voZlyRK7tRHT+9d/tVkbl1zijPHrr7tx8+VrcNCtjUsu8aM1\nbZpLqf30p/7jD47G5s2uluebqo77+fOf+4/ZsmXOsL/8sjMyvli+3Dm4F17oF+WBW6svv2wj676Y\nsIZlxQo3Ca+8Au94hz+9d70LHnoILrvMn9aqVfDwwy6c9VW4q1Y5I7V1K1x6qR+tKVOc9/fYY/DO\nd/rRArjoIviHf7ARgksugS1bnPLwpXfxxa54/NxzNoZl1Sq3NizG7J3vhB/+0Clx3y2ll13mxuyl\nl2xSJ5ddBn/7tzYysGKFW2eXXOKfWl692hmpl17y56231xm6f/xHm3V78cXw+OM26+zSS10/X3/d\n31HwxYQ1LHHx+Zln/HdeAVx+uRP4d73LhtYPfgDvfrc/rUsvdcpj716bKGP1art+/tIvOeXx3vf6\n03r3u53nt3y53+1cwHmOq1a5flrMgeXaWLXKbaCwWLMLFrg617PP2hi997zHrVuLfl5xhVO4l5+V\nOC+OSy91RmXPHpto6n3vs1u3v/zL8P3v2/Rz1SqXAbjwQr9zeRaYsIYF4FOfchPq8+yIGNdf7/5+\n7GP+tH71V93fG25o/708mDIF+vvh2mv9ox+A3/gN9/cDH/CnFY/Vtdf601q61HmQn/iEPy1wPM2d\naxPN/tqvub+f+pQ/rfe9z81pTNMX117rDILFQ6FiGbj66vbfy4MPftD9ve46f1p9ffDRj8K//bc2\nMhCP/ZVXtv9eHnz0o+6vhQwsW+Zen/ykPy1fyNiGrfENEdGifRkddYfNrKz78HAzaY2MuN0nvikF\ncFsjjx/3jwpiHDvm0joWGB52/fTNVYPr54kTzZzPEyecsrSAqlsfVvQs+3n0qN99vZIYGXHrwsKw\nqLraj9W6texnURkQEVTVQDOk6E5kwxIQEBAwkdEtwzKhU2EBAQEBAfYIhiUgICAgwBTBsAQEBAQE\nmCIYloCAgIAAUwTDEhAQEBBgimBYAgICAgJMEQxLQEBAQIApgmEJCAgICDBFMCwBAQEBAaYIhiUg\nICAgwBTBsAQEBAQEmCIYloCAgIAAUwTDEhAQEBBgCm/DIiL/WUROici8RNttIrJNRLaIyDWJ9itE\nZFP02VcT7VNE5NtR+5MiclHis1tEZGv0+i1ffgMCAgICugsvwyIiy4GPA68n2lYDNwGrgTXA10RO\nPwnkbmCtqq4EVorImqh9LbA3ar8LuDOiNQ/4EnBl9LpdROb48FwlBgYG6mbhLASe8qGJPEEz+Qo8\n5UMTeeoWfCOWPwX+S6rteuABVR1R1e3Ay8BVIrIYmKmqG6Pv3QfEz0i8Drg3un4IiJ9B9wngcVU9\noKoHgA04YzUu0MSFFHjKhybyBM3kK/CUD03kqVsobVhE5HpgUFWfT320BBhMvB8Elma0D0XtRH93\nAKjqKHBQROa3oRUQEBAQ0FBMbvehiGwAFmV89EXgNuCa5NcN+QoICAgIGK9Q1cIv4N3AbuC16DUC\nbAcWAl8AvpD47mPAVTgD9WKi/TeBuxPf+UB0PRl4M7q+Gfh/E7/5OnBTC540vMIrvMIrvIq9ytiA\nTi+TZ96LyGvAFaq6LyrefwtXbF8K/APwDlVVEXkK+CywEfg74M9V9TERuRW4XFV/R0RuBm5Q1Zuj\n4v2PgffjIqJngPdH9ZaAgICAgAaibSqsAE5bJ1XdLCIPApuBUeBWHbNetwLfBKYBj6rqY1H7PcD9\nIrIN2IuLVIgM1ZeBp6PvrQ9GJSAgIKDZMIlYAgICAgICYoz7k/cisiY6iLlNRD5fwf/bLiLPi8iz\nIrIxapsnIhuiQ5yPJ8/aFD0smpOH/yEiu0VkU6LNjId2B1YL8rRORAajsXpWRD5ZMU/LReSHIvIz\nEXlBRD5b91i14anusZoqIk+JyHMisllE/rgBY9WKp1rHKvrdpOh/f6/ucWrDU33j1I3CTVUvYBLu\nnMzFQC/wHLCqy//zNWBequ1PgP8SXX8e+Ep0vTriqTfi8WXGosSNwJXR9aPAmgI8/ArwPmBTN3jA\npSy/Fl3fBPzPkjzdDvx+xner4mkR8N7oegbwErCqzrFqw1OtYxV9d3r0dzLwJPChBqyrLJ6aMFa/\nD/w18EgT5K8FT7WNU9eVfzdfwP8CPJZ4f8aOtC79z9eA+am2LcDC6HoRsCW6vg34fOJ7jwEfABZz\n5g65M3a/5eTjYs5U4mY8RN+5Kro+vUuvBE+3A/8543uV8ZT6vw8DH2vCWGXw1JixAqbj6prvaspY\npXiqdayAZbhNSR8BvtcE+WvB07q6xmm8p8JOH6yMUMUBSgX+QUR+LCK/HbUtVNXd0fVu3LZrKHdY\ntCwsecg6sDqPcvg/ROSnInJPIj1QOU8icjEuonqKhoxVgqcno6Zax0pEekTkOdyY/FBVf0bNY9WC\nJ6h3rO4C/gA4lWire01l8aTUNE7j3bBoDf/z36jq+4BPAv9JRH7lDIacSa+Dr0bxEOFuYAXwXuAN\n4P+ugwkRmYG7VdDnVPVw8rO6xiri6W8ino7QgLFS1VOq+l6c9/thEflI6vPKxyqDp35qHCsRuRbY\no6rP0uJQeNXj1Ian2sZpvBuWIWB54v1yzrS45lDVN6K/bwLfwZ3X2S0iiwDE3RNtTwv+lkX8DUXX\nyfYhT9YseBhM/ObCiNZkYLaq7ivKkKru0QjAX+LGqlKeRKQXZ1TuV9WHo+ZaxyrB01/FPDVhrGKo\n6kHcObMraMi6SvD0SzWP1QeB68Sd3XsA+KiI3E+945TF0321jlOn3F2TX7hc3yu43H4fXS7e4/K8\nM6Pr84B/wd3W5k+Icpa4Ok+6cNeH8xxeYaxI9hTujgRCweJ99PuLObt4b8IDrlAX3xXhZvIXD9M8\nLU5c/x7wrSp5imjcB9yVaq9trNrwVPdYLQDmRNfTgB/hbgZb51i14mlRnWOV+N+/ylg9o3b5y+Cp\ntjVVi0GwfOFSUi/hdjbc1uX/tSKakOeAF+L/B8zDFc62Ao/HwhB99ocRb1uATyTarwA2RZ/9eUE+\nHgB2Aidwec9/Z8kDMAV4ENiGy/9fXIKnf49ToM8DP8UVqRdWzNOHcDnn54Bno9eaOseqBU+fbMBY\nXQ78JOLreeAPrNd2ibFqxVOtY5X47a8ytgOrVvlL/LY/wdP9dY1TOCAZEBAQEGCK8V5jCQgICAho\nGIJhCQgICAgwRTAsAQEBAQGmCIYlICAgIMAUwbAEBAQEBJgiGJaAgICAAFMEwxIQEBAQYIpgWAIC\nAgICTPH/A3SQ+BWEs4KkAAAAAElFTkSuQmCC\n",
       "text": [
        "<matplotlib.figure.Figure at 0x11deda710>"
       ]
      }
     ],
     "prompt_number": 289
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "loop_secs = %timeit -o for t in ran_t: g(7, t)\n",
      "loop_secs.best"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "1 loops, best of 3: 252 ms per loop\n"
       ]
      },
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 290,
       "text": [
        "0.25186636099533644"
       ]
      }
     ],
     "prompt_number": 290
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "def comparison(slower, faster):\n",
      "    'slower, faster: seconds'\n",
      "    ratio = slower/faster\n",
      "    order_of_magnitude = np.log10(ratio)\n",
      "    return ratio, order_of_magnitude"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 291
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "print(\"With record_history disabled:\\n\"\n",
      "      \"Vectorized approach is %d times (about %.1f orders of magnitude) faster\" \n",
      "      % comparison(slower=loop_secs.best, faster=vectorized_secs.best))"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "With record_history disabled:\n",
        "Vectorized approach is 551 times (about 2.7 orders of magnitude) faster\n"
       ]
      }
     ],
     "prompt_number": 292
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "##With no decorator,\n",
      "##it's ~2.7 orders of magnitude faster to use a function as a numpy ufunc than to call it in a for loop (looping through ran_t)"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "#A `record_history`-decorated version of the same function"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "from log_calls import record_history\n",
      "@record_history()\n",
      "def f(freq, t):\n",
      "    return np.sin(freq * 2 * np.pi * t)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 293
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "#`record_history` disabled"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "f.record_history_settings.enabled = False"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 294
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "vectorized_secs_rh_disabled = %timeit -o Hz_17 = f(17, ran_t)\n",
      "vectorized_secs_rh_disabled.best"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "1000 loops, best of 3: 490 \u00b5s per loop\n"
       ]
      },
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 295,
       "text": [
        "0.0004900190659973305"
       ]
      }
     ],
     "prompt_number": 295
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "loop_secs_rh_disabled = %timeit -o for t in ran_t: f(7, t)\n",
      "loop_secs_rh_disabled.best"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "1 loops, best of 3: 1.73 s per loop\n"
       ]
      },
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 296,
       "text": [
        "1.72951482499775"
       ]
      }
     ],
     "prompt_number": 296
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "print(\"With record_history disabled:\\n\"\n",
      "      \"Vectorized approach is %d times (about %.1f orders of magnitude) faster\" \n",
      "      % comparison(slower=loop_secs_rh_disabled.best, faster=vectorized_secs_rh_disabled.best))"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "With record_history disabled:\n",
        "Vectorized approach is 3529 times (about 3.5 orders of magnitude) faster\n"
       ]
      }
     ],
     "prompt_number": 297
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "##With record_history disabled,\n",
      "##it's 3.5 orders of magnitude faster to use a function as a numpy ufunc than to call it in a for loop (looping through ran_t)"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "#`record_history` enabled"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "f.record_history_settings.enabled = True\n",
      "f.stats.clear_history()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 298
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "vectorized_secs_rh_enabled = %timeit -o f.stats.clear_history(); Hz_17 = f(17, ran_t)\n",
      "vectorized_secs_rh_enabled.best"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "1000 loops, best of 3: 701 \u00b5s per loop\n"
       ]
      },
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 299,
       "text": [
        "0.0007013606440013973"
       ]
      }
     ],
     "prompt_number": 299
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "len(f.stats.history)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 300,
       "text": [
        "1"
       ]
      }
     ],
     "prompt_number": 300
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "def size_of_t_for_row(row):\n",
      "    return f.stats.history[row].argvals[1].size\n",
      "\n",
      "size_of_t_for_row(0)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 301,
       "text": [
        "44100"
       ]
      }
     ],
     "prompt_number": 301
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "f.stats.history[0].retval.size"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 302,
       "text": [
        "44100"
       ]
      }
     ],
     "prompt_number": 302
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "f.stats.history"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 303,
       "text": [
        "(CallRecord(call_num=1, argnames=['freq', 't'], argvals=(17, array([  0.00000000e+00,   2.26757365e-05,   4.53514731e-05, ...,\n",
        "         9.99931931e-01,   9.99954641e-01,   9.99977291e-01], dtype=float32)), varargs=(), explicit_kwargs=OrderedDict(), defaulted_kwargs=OrderedDict(), implicit_kwargs={}, retval=array([ 0.        ,  0.00242209,  0.00484416, ..., -0.00727302,\n",
        "       -0.00484692, -0.00242842], dtype=float32), elapsed_secs=0.0004661083221435547, timestamp='11/07/14 20:33:05.452003', prefixed_func_name='f', caller_chain=['inner']),)"
       ]
      }
     ],
     "prompt_number": 303
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "f.stats.clear_history()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 304
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "loop_secs_rh_enabled = %timeit -o for t in ran_t: f(7, t); f.stats.clear_history()\n",
      "loop_secs_rh_enabled.best"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "1 loops, best of 3: 10.5 s per loop\n"
       ]
      },
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 305,
       "text": [
        "10.49896942700434"
       ]
      }
     ],
     "prompt_number": 305
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "print(\"With record_history enabled:\\n\"\n",
      "      \"Vectorized approach is %d times (about %.1f orders of magnitude) faster\" \n",
      "      % comparison(slower=loop_secs_rh_enabled.best, faster=vectorized_secs_rh_enabled.best))"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "With record_history enabled:\n",
        "Vectorized approach is 14969 times (about 4.2 orders of magnitude) faster\n"
       ]
      }
     ],
     "prompt_number": 306
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "##With record_history enabled,\n",
      "##it's 4+ orders of magnitude faster to use a function as a numpy ufunc than to call it in a for loop (looping through ran_t)\n",
      "So recording history slows things down by another order of magnitude :|"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "---"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "f.stats.clear_history()\n",
      "for t in ran_t: f(7, t)\n",
      "df = f.stats.history_as_DataFrame"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 307
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "from IPython.display import display\n",
      "display(df.head())\n",
      "display(df.tail())"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "html": [
        "<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n",
        "<table border=\"1\" class=\"dataframe\">\n",
        "  <thead>\n",
        "    <tr style=\"text-align: right;\">\n",
        "      <th></th>\n",
        "      <th>freq</th>\n",
        "      <th>t</th>\n",
        "      <th>retval</th>\n",
        "      <th>elapsed_secs</th>\n",
        "      <th>timestamp</th>\n",
        "      <th>prefixed_fname</th>\n",
        "      <th>caller_chain</th>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>call_num</th>\n",
        "      <th></th>\n",
        "      <th></th>\n",
        "      <th></th>\n",
        "      <th></th>\n",
        "      <th></th>\n",
        "      <th></th>\n",
        "      <th></th>\n",
        "    </tr>\n",
        "  </thead>\n",
        "  <tbody>\n",
        "    <tr>\n",
        "      <th>1</th>\n",
        "      <td> 7</td>\n",
        "      <td> 0.000000</td>\n",
        "      <td> 0.000000</td>\n",
        "      <td> 0.000041</td>\n",
        "      <td> 11/07/14 20:34:31.921803</td>\n",
        "      <td> 'f'</td>\n",
        "      <td> ['&lt;module&gt;']</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>2</th>\n",
        "      <td> 7</td>\n",
        "      <td> 0.000023</td>\n",
        "      <td> 0.000997</td>\n",
        "      <td> 0.000016</td>\n",
        "      <td> 11/07/14 20:34:31.922090</td>\n",
        "      <td> 'f'</td>\n",
        "      <td> ['&lt;module&gt;']</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>3</th>\n",
        "      <td> 7</td>\n",
        "      <td> 0.000045</td>\n",
        "      <td> 0.001995</td>\n",
        "      <td> 0.000015</td>\n",
        "      <td> 11/07/14 20:34:31.922319</td>\n",
        "      <td> 'f'</td>\n",
        "      <td> ['&lt;module&gt;']</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>4</th>\n",
        "      <td> 7</td>\n",
        "      <td> 0.000068</td>\n",
        "      <td> 0.002992</td>\n",
        "      <td> 0.000015</td>\n",
        "      <td> 11/07/14 20:34:31.922545</td>\n",
        "      <td> 'f'</td>\n",
        "      <td> ['&lt;module&gt;']</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>5</th>\n",
        "      <td> 7</td>\n",
        "      <td> 0.000091</td>\n",
        "      <td> 0.003989</td>\n",
        "      <td> 0.000014</td>\n",
        "      <td> 11/07/14 20:34:31.922770</td>\n",
        "      <td> 'f'</td>\n",
        "      <td> ['&lt;module&gt;']</td>\n",
        "    </tr>\n",
        "  </tbody>\n",
        "</table>\n",
        "</div>"
       ],
       "metadata": {},
       "output_type": "display_data",
       "text": [
        "          freq         t    retval  elapsed_secs                 timestamp  \\\n",
        "call_num                                                                     \n",
        "1            7  0.000000  0.000000      0.000041  11/07/14 20:34:31.921803   \n",
        "2            7  0.000023  0.000997      0.000016  11/07/14 20:34:31.922090   \n",
        "3            7  0.000045  0.001995      0.000015  11/07/14 20:34:31.922319   \n",
        "4            7  0.000068  0.002992      0.000015  11/07/14 20:34:31.922545   \n",
        "5            7  0.000091  0.003989      0.000014  11/07/14 20:34:31.922770   \n",
        "\n",
        "         prefixed_fname  caller_chain  \n",
        "call_num                               \n",
        "1                   'f'  ['<module>']  \n",
        "2                   'f'  ['<module>']  \n",
        "3                   'f'  ['<module>']  \n",
        "4                   'f'  ['<module>']  \n",
        "5                   'f'  ['<module>']  "
       ]
      },
      {
       "html": [
        "<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n",
        "<table border=\"1\" class=\"dataframe\">\n",
        "  <thead>\n",
        "    <tr style=\"text-align: right;\">\n",
        "      <th></th>\n",
        "      <th>freq</th>\n",
        "      <th>t</th>\n",
        "      <th>retval</th>\n",
        "      <th>elapsed_secs</th>\n",
        "      <th>timestamp</th>\n",
        "      <th>prefixed_fname</th>\n",
        "      <th>caller_chain</th>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>call_num</th>\n",
        "      <th></th>\n",
        "      <th></th>\n",
        "      <th></th>\n",
        "      <th></th>\n",
        "      <th></th>\n",
        "      <th></th>\n",
        "      <th></th>\n",
        "    </tr>\n",
        "  </thead>\n",
        "  <tbody>\n",
        "    <tr>\n",
        "      <th>44096</th>\n",
        "      <td> 7</td>\n",
        "      <td> 0.999887</td>\n",
        "      <td>-0.004986</td>\n",
        "      <td> 0.000012</td>\n",
        "      <td> 11/07/14 20:34:41.982512</td>\n",
        "      <td> 'f'</td>\n",
        "      <td> ['&lt;module&gt;']</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>44097</th>\n",
        "      <td> 7</td>\n",
        "      <td> 0.999909</td>\n",
        "      <td>-0.003990</td>\n",
        "      <td> 0.000011</td>\n",
        "      <td> 11/07/14 20:34:41.982698</td>\n",
        "      <td> 'f'</td>\n",
        "      <td> ['&lt;module&gt;']</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>44098</th>\n",
        "      <td> 7</td>\n",
        "      <td> 0.999932</td>\n",
        "      <td>-0.002994</td>\n",
        "      <td> 0.000011</td>\n",
        "      <td> 11/07/14 20:34:41.982883</td>\n",
        "      <td> 'f'</td>\n",
        "      <td> ['&lt;module&gt;']</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>44099</th>\n",
        "      <td> 7</td>\n",
        "      <td> 0.999955</td>\n",
        "      <td>-0.001995</td>\n",
        "      <td> 0.000015</td>\n",
        "      <td> 11/07/14 20:34:41.983069</td>\n",
        "      <td> 'f'</td>\n",
        "      <td> ['&lt;module&gt;']</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>44100</th>\n",
        "      <td> 7</td>\n",
        "      <td> 0.999977</td>\n",
        "      <td>-0.000999</td>\n",
        "      <td> 0.000012</td>\n",
        "      <td> 11/07/14 20:34:41.983258</td>\n",
        "      <td> 'f'</td>\n",
        "      <td> ['&lt;module&gt;']</td>\n",
        "    </tr>\n",
        "  </tbody>\n",
        "</table>\n",
        "</div>"
       ],
       "metadata": {},
       "output_type": "display_data",
       "text": [
        "          freq         t    retval  elapsed_secs                 timestamp  \\\n",
        "call_num                                                                     \n",
        "44096        7  0.999887 -0.004986      0.000012  11/07/14 20:34:41.982512   \n",
        "44097        7  0.999909 -0.003990      0.000011  11/07/14 20:34:41.982698   \n",
        "44098        7  0.999932 -0.002994      0.000011  11/07/14 20:34:41.982883   \n",
        "44099        7  0.999955 -0.001995      0.000015  11/07/14 20:34:41.983069   \n",
        "44100        7  0.999977 -0.000999      0.000012  11/07/14 20:34:41.983258   \n",
        "\n",
        "         prefixed_fname  caller_chain  \n",
        "call_num                               \n",
        "44096               'f'  ['<module>']  \n",
        "44097               'f'  ['<module>']  \n",
        "44098               'f'  ['<module>']  \n",
        "44099               'f'  ['<module>']  \n",
        "44100               'f'  ['<module>']  "
       ]
      }
     ],
     "prompt_number": 308
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "df[:5]"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "html": [
        "<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n",
        "<table border=\"1\" class=\"dataframe\">\n",
        "  <thead>\n",
        "    <tr style=\"text-align: right;\">\n",
        "      <th></th>\n",
        "      <th>freq</th>\n",
        "      <th>t</th>\n",
        "      <th>retval</th>\n",
        "      <th>elapsed_secs</th>\n",
        "      <th>timestamp</th>\n",
        "      <th>prefixed_fname</th>\n",
        "      <th>caller_chain</th>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>call_num</th>\n",
        "      <th></th>\n",
        "      <th></th>\n",
        "      <th></th>\n",
        "      <th></th>\n",
        "      <th></th>\n",
        "      <th></th>\n",
        "      <th></th>\n",
        "    </tr>\n",
        "  </thead>\n",
        "  <tbody>\n",
        "    <tr>\n",
        "      <th>1</th>\n",
        "      <td> 7</td>\n",
        "      <td> 0.000000</td>\n",
        "      <td> 0.000000</td>\n",
        "      <td> 0.000041</td>\n",
        "      <td> 11/07/14 20:34:31.921803</td>\n",
        "      <td> 'f'</td>\n",
        "      <td> ['&lt;module&gt;']</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>2</th>\n",
        "      <td> 7</td>\n",
        "      <td> 0.000023</td>\n",
        "      <td> 0.000997</td>\n",
        "      <td> 0.000016</td>\n",
        "      <td> 11/07/14 20:34:31.922090</td>\n",
        "      <td> 'f'</td>\n",
        "      <td> ['&lt;module&gt;']</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>3</th>\n",
        "      <td> 7</td>\n",
        "      <td> 0.000045</td>\n",
        "      <td> 0.001995</td>\n",
        "      <td> 0.000015</td>\n",
        "      <td> 11/07/14 20:34:31.922319</td>\n",
        "      <td> 'f'</td>\n",
        "      <td> ['&lt;module&gt;']</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>4</th>\n",
        "      <td> 7</td>\n",
        "      <td> 0.000068</td>\n",
        "      <td> 0.002992</td>\n",
        "      <td> 0.000015</td>\n",
        "      <td> 11/07/14 20:34:31.922545</td>\n",
        "      <td> 'f'</td>\n",
        "      <td> ['&lt;module&gt;']</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>5</th>\n",
        "      <td> 7</td>\n",
        "      <td> 0.000091</td>\n",
        "      <td> 0.003989</td>\n",
        "      <td> 0.000014</td>\n",
        "      <td> 11/07/14 20:34:31.922770</td>\n",
        "      <td> 'f'</td>\n",
        "      <td> ['&lt;module&gt;']</td>\n",
        "    </tr>\n",
        "  </tbody>\n",
        "</table>\n",
        "</div>"
       ],
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 309,
       "text": [
        "          freq         t    retval  elapsed_secs                 timestamp  \\\n",
        "call_num                                                                     \n",
        "1            7  0.000000  0.000000      0.000041  11/07/14 20:34:31.921803   \n",
        "2            7  0.000023  0.000997      0.000016  11/07/14 20:34:31.922090   \n",
        "3            7  0.000045  0.001995      0.000015  11/07/14 20:34:31.922319   \n",
        "4            7  0.000068  0.002992      0.000015  11/07/14 20:34:31.922545   \n",
        "5            7  0.000091  0.003989      0.000014  11/07/14 20:34:31.922770   \n",
        "\n",
        "         prefixed_fname  caller_chain  \n",
        "call_num                               \n",
        "1                   'f'  ['<module>']  \n",
        "2                   'f'  ['<module>']  \n",
        "3                   'f'  ['<module>']  \n",
        "4                   'f'  ['<module>']  \n",
        "5                   'f'  ['<module>']  "
       ]
      }
     ],
     "prompt_number": 309
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "len(f.stats.history)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 311,
       "text": [
        "44100"
       ]
      }
     ],
     "prompt_number": 311
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "df[['t', 'retval']].head()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "html": [
        "<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n",
        "<table border=\"1\" class=\"dataframe\">\n",
        "  <thead>\n",
        "    <tr style=\"text-align: right;\">\n",
        "      <th></th>\n",
        "      <th>t</th>\n",
        "      <th>retval</th>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>call_num</th>\n",
        "      <th></th>\n",
        "      <th></th>\n",
        "    </tr>\n",
        "  </thead>\n",
        "  <tbody>\n",
        "    <tr>\n",
        "      <th>1</th>\n",
        "      <td> 0.000000</td>\n",
        "      <td> 0.000000</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>2</th>\n",
        "      <td> 0.000023</td>\n",
        "      <td> 0.000997</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>3</th>\n",
        "      <td> 0.000045</td>\n",
        "      <td> 0.001995</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>4</th>\n",
        "      <td> 0.000068</td>\n",
        "      <td> 0.002992</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>5</th>\n",
        "      <td> 0.000091</td>\n",
        "      <td> 0.003989</td>\n",
        "    </tr>\n",
        "  </tbody>\n",
        "</table>\n",
        "</div>"
       ],
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 312,
       "text": [
        "                 t    retval\n",
        "call_num                    \n",
        "1         0.000000  0.000000\n",
        "2         0.000023  0.000997\n",
        "3         0.000045  0.001995\n",
        "4         0.000068  0.002992\n",
        "5         0.000091  0.003989"
       ]
      }
     ],
     "prompt_number": 312
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "plt.plot(df.t, df.retval);"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "display_data",
       "png": "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\n",
       "text": [
        "<matplotlib.figure.Figure at 0x110d62048>"
       ]
      }
     ],
     "prompt_number": 313
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [],
     "language": "python",
     "metadata": {},
     "outputs": []
    }
   ],
   "metadata": {}
  }
 ]
}