Skip to content

Instantly share code, notes, and snippets.

@scopatz
Created January 11, 2017 05:45
Show Gist options
  • Save scopatz/29b94326ec1f10056d27e9d9434b240a to your computer and use it in GitHub Desktop.
Save scopatz/29b94326ec1f10056d27e9d9434b240a to your computer and use it in GitHub Desktop.
Cache scaling
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"%matplotlib inline\n",
"import sys\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"class Cache(object):\n",
"\n",
" def __init__(self, origfunc):\n",
" self.origfunc = origfunc\n",
" self.memo = {}\n",
"\n",
" def __call__(self, *args):\n",
" if args in self.memo:\n",
" return self.memo[args]\n",
" answer = self.origfunc(*args)\n",
" self.memo[args] = answer\n",
" return answer\n",
"\n",
"@Cache\n",
"def fibo(n):\n",
" if n == 0: return 0\n",
" if n == 1: return 1\n",
" return fibo(n-1) + fibo(n-2)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"64 broke at 6\n",
"128 broke at 16\n",
"256 broke at 38\n",
"512 broke at 80\n",
"1024 broke at 166\n",
"2048 broke at 336\n",
"4096 broke at 678\n",
"8192 broke at 1360\n",
"16384 broke at 2726\n",
"CPU times: user 8.23 s, sys: 32 ms, total: 8.26 s\n",
"Wall time: 8.27 s\n"
]
}
],
"source": [
"%%time\n",
"last_limit = 0\n",
"xs = [2**i for i in range(6, 15)]\n",
"ys = []\n",
"for x in xs:\n",
" sys.setrecursionlimit(x)\n",
" for i in range(last_limit, x):\n",
" fibo.memo.clear()\n",
" try:\n",
" fibo(i)\n",
" except RecursionError:\n",
" print(x, \"broke at\", i)\n",
" last_limit = i\n",
" ys.append(i)\n",
" break"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f17852d9828>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot(xs, ys, 'k-')\n",
"plt.xlabel('recursion limit')\n",
"plt.ylabel('max fibo(i) computable')\n",
"plt.savefig('fibo.png')"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384]"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"xs"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[6, 16, 38, 80, 166, 336, 678, 1360, 2726]"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ys"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[10.666666666666666,\n",
" 8.0,\n",
" 6.7368421052631575,\n",
" 6.4,\n",
" 6.168674698795181,\n",
" 6.095238095238095,\n",
" 6.041297935103245,\n",
" 6.023529411764706,\n",
" 6.010271460014674]"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"[a/b for a, b in zip(xs, ys)]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.2"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment