Skip to content

Instantly share code, notes, and snippets.

@teoliphant
Created March 10, 2013 15:33
Show Gist options
  • Save teoliphant/5129010 to your computer and use it in GitHub Desktop.
Save teoliphant/5129010 to your computer and use it in GitHub Desktop.
Using Numba to implement a summation
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": "Using Numba"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"I always enjoy showing people how much easier Numba makes it to speed up their NumPy-based technical codes. With Numba, you usually can just write the code with loops and then add a decorator to your function and get speed-ups equivalent to having written the code in another compiled language (like C or Fortran). \n",
"\n",
"Tonight when I saw this question on Stack Exchange: http://scicomp.stackexchange.com/questions/5473/how-to-express-this-complicated-expression-using-numpy-slices it looked like a perfect opportunity to test Numba again.\n",
"\n",
"So, I copied the looped_ver code from Nat Wilson (modified it slightly to make x[0] = 0) and then decorated it to let Numba compile the code. The result continues to impress me about the code that Mark Florisson, Jon Riehl, and Siu Kwan Lam have put together. Here is the equation that is being solved:\n",
"\n",
"$$\\displaystyle x_i = \\sum_{j=0}^{i-1} k_{i-j} a_{i-j} a_{j}$$\n"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import numpy as np\n",
"from numba import jit, autojit\n",
"\n",
"def looped_ver(k, a):\n",
" x = np.empty_like(a)\n",
" x[0] = 0.0\n",
" for i in range(1, x.size):\n",
" sm = 0.0\n",
" for j in range(0, i):\n",
" sm += k[i-j,j] * a[i-j] * a[j]\n",
" x[i] = sm\n",
" return x\n",
"\n",
"typed_ver = jit('f8[:](f8[:,:],f8[:])')(looped_ver)\n",
"auto_ver = autojit(looped_ver)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import time\n",
"import numpy as np\n",
"repeat = 3\n",
"\n",
"def getbest(func, *args):\n",
" import time\n",
" best = 1e12\n",
" for i in range(repeat):\n",
" start = time.time()\n",
" func(*args)\n",
" current = time.time() - start\n",
" if current < best:\n",
" best = current\n",
" return best\n",
" \n",
"\n",
"def timeit(N):\n",
" res = {'looped':[], 'auto':[], 'typed':[]}\n",
" for n in N:\n",
" k = np.random.rand(n,n)\n",
" a = np.random.rand(n)\n",
" for version in ['looped', 'auto', 'typed']:\n",
" func = eval('%s_ver' % version)\n",
" res[version].append(getbest(func, k, a))\n",
" return res"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"N = [100,200,500,1000,5000]\n",
"res = timeit(N)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 3
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%pylab inline"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.zmq.pylab.backend_inline].\n",
"For more information, type 'help(pylab)'.\n"
]
}
],
"prompt_number": 4
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"plot(N, log10(res['typed']), N, log10(res['auto']), N, log10(res['looped']))\n",
"legend(['Typed', 'Autojit', 'Python'], loc='upper left')\n",
"ylabel(r'$\\log_{10}$(time) in seconds')\n",
"xlabel('Size (N)')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 5,
"text": [
"<matplotlib.text.Text at 0x1099c0bd0>"
]
},
{
"output_type": "display_data",
"png": "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\n"
}
],
"prompt_number": 5
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"[res['looped'][i]/res['auto'][i] for i in range(len(N))]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 6,
"text": [
"[1127.4761904761904,\n",
" 1435.7611940298507,\n",
" 1317.400260756193,\n",
" 256.7791019225705,\n",
" 137.61178578348566]"
]
}
],
"prompt_number": 6
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from numba import _version\n",
"print _version.version_version"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"0.7.0\n"
]
}
],
"prompt_number": 10
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This was run on a Macbook Air. Running `sysctl -n machdep.cpu.brand_string` resulted in:\n",
"\n",
" Intel(R) Core(TM) i7-2677M CPU @ 1.80GHz"
]
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment