Skip to content

Instantly share code, notes, and snippets.

@astrojuanlu
Created October 18, 2012 21:39
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save astrojuanlu/3914904 to your computer and use it in GitHub Desktop.
Save astrojuanlu/3914904 to your computer and use it in GitHub Desktop.
numba, a jit for Python
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": "numba"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This example assumes the notebook server has been called with `ipython notebook --pylab inline` and the trunk version of numba at Github."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import numpy as np\n",
"from numba import autojit, jit, double"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Numba provides two major decorators: `jit` and `autojit`. \n",
"\n",
"The `jit` decorator returns a compiled version of the function using the input types and the output types of the function. You can specify the type using `out_type(in_type, ...)` syntax. Array inputs can be specified using `[:,:]` appended to the type. \n",
"\n",
"The `autojit` decorator does not require you to specify any types. It watches for what types you call the function with and infers the type of the return. If there is a previously compiled version of the code available it uses it, if not it generates machine code for the function and then executes that code. "
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def sum(arr):\n",
" M, N = arr.shape\n",
" sum = 0.0\n",
" for i in range(M):\n",
" for j in range(N):\n",
" sum += arr[i,j]\n",
" return sum\n",
"fastsum = jit('f8(f8[:,:])')(sum)\n",
"flexsum = autojit(sum)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"arr2d = np.arange(600,dtype=float).reshape(20,30)\n",
"print sum(arr2d)\n",
"print fastsum(arr2d)\n",
"print flexsum(arr2d)\n",
"print flexsum(arr2d.astype(int))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"179700.0\n",
"179700.0\n",
"179700.0\n",
"179700.0\n"
]
}
],
"prompt_number": 3
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%timeit sum(arr2d)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"1000 loops, best of 3: 393 us per loop\n"
]
}
],
"prompt_number": 4
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%timeit fastsum(arr2d)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"100000 loops, best of 3: 2.88 us per loop\n"
]
}
],
"prompt_number": 5
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"393 / 2.88 # speedup"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 6,
"text": [
"136.45833333333334"
]
}
],
"prompt_number": 6
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%timeit arr2d.sum() "
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"100000 loops, best of 3: 7.9 us per loop\n"
]
}
],
"prompt_number": 7
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"7.9 / 2.88 # even provides a speedup over general-purpose NumPy surm"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 8,
"text": [
"2.743055555555556"
]
}
],
"prompt_number": 8
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The speed-up is even more pronounced the more inner loops in the code. Here is an image processing example:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"@jit('void(f8[:,:],f8[:,:],f8[:,:])')\n",
"def filter(image, filt, output):\n",
" M, N = image.shape\n",
" m, n = filt.shape\n",
" for i in range(m//2, M-m//2):\n",
" for j in range(n//2, N-n//2):\n",
" result = 0.0\n",
" for k in range(m):\n",
" for l in range(n):\n",
" result += image[i+k-m//2,j+l-n//2]*filt[k, l]\n",
" output[i,j] = result\n",
"\n",
"from scipy.misc import lena\n",
"import time\n",
"image = lena().astype('double')\n",
"filt = np.ones((15,15),dtype='double')\n",
"filt /= filt.sum()\n",
"output = image.copy()\n",
"filter(image, filt, output)\n",
"gray()\n",
"imshow(output)\n",
"start = time.time()\n",
"filter(image[:100,:100], filt, output[:100,:100])\n",
"fast = time.time() - start\n",
"start = time.time()\n",
"filter.py_func(image[:100,:100], filt, output[:100,:100])\n",
"slow = time.time() - start\n",
"print \"Python: %f s; Numba: %f ms; Speed up is %f\" % (slow, fast*1000, slow / fast)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Python: 2.717911 s; Numba: 4.322052 ms; Speed up is 628.847363\n"
]
},
{
"output_type": "display_data",
"png": "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\nM2fwwAMP4M4778Rdd92Fl156aVmX9/Lly9ixYwe2bduGLVu24Mc//vGyLi/wWSRt+/btePjhh5d9\nWXt6evClL30J27dv9ykD17S8bpFkZmbGbdiwwZ06dcpNTU253t5ed/z48cW6fVT+8pe/uH/84x/u\nrrvu8r8988wz7oUXXnDOOXfw4EH33HPPOeec++c//+l6e3vd1NSUO3XqlNuwYYO7cuXKopX1/Pnz\n7v3333fOOXfp0iW3adMmd/z48WVbXuecm5iYcM45Nz097Xbs2OHeeeedZV3en//85+7JJ590Dz/8\nsHNu+Y4F55zr6elxQ0NDqd+uZXkXDRzeffddt3v3bv/9wIED7sCBA4t1+0w5depUChzuuOMOd+HC\nBefcZxPyjjvucM45t3//fnfw4EF/3O7du93f/va3xS2syDe/+U33pz/96boo78TEhLv77rvdRx99\ntGzLe+bMGffggw+6t956y33jG99wzi3vsdDT0+MGBwdTv13L8i6aWdHX14dbbrnFf48tyloOkrWw\nrLu72x+3lHX45JNP8P7772PHjh3Luryzs7PYtm0burq6vEm0XMv79NNP48UXX0wlMy3XsgJziyLv\nvvtu/PKXv7zm5V20PIfrNfnpahaWfd4yPj6Oxx57DL/4xS/Q2tpaVZ7lVN5cLocPPvgAo6Oj2L17\nN/785z9XlWc5lPe1117DmjVrsH37dhw9ejRaluVQVsrnsShSZdGYg12UdebMmRSSLSf5vy4s+zxl\nenoajz32GPbt2+fXtCzn8lLa29vx9a9/HceOHVuW5X333Xdx+PBhrF+/Hk888QTeeust7Nu3b1mW\nlfJ5LIpMyTU2g6IyPT3tbrvtNnfq1ClXqVSWjUPSuWqfwzPPPOPtswMHDlQ5dSqVijt58qS77bbb\n3Ozs7KKVc3Z21u3bt8/94Ac/SP2+XMs7MDDghoeHnXPOlctl99WvftW9+eaby7a8lKNHj3qfw3It\n68TEhBsbG3POOTc+Pu6+/OUvuz/+8Y/XtLyLBg7OOff666+7TZs2uQ0bNrj9+/cv5q2j8vjjj7u1\na9e6FStWuO7ubvfqq6+6oaEh9+CDD7rbb7/d7dy50w9w55z7yU9+4jZs2ODuuOMOd+TIkUUt6zvv\nvOOSJHG9vb1u27Ztbtu2be4Pf/jDsi3vhx9+6LZv3+56e3vd1q1b3U9/+lPnnFu25aUcPXrURyuW\na1lPnjzpent7XW9vr7vzzjv9fLqW5V30hVd1qUtdrg+pZ0jWpS51CUodHOpSl7oEpQ4OdalLXYJS\nB4e61KUuQamDQ13qUpeg1MGhLnWpS1D+BzK3hV19V56DAAAAAElFTkSuQmCC\n"
}
],
"prompt_number": 9
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You can call Numba-created functions from other Numba-created functions"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"@autojit\n",
"def mandel(x, y, max_iters):\n",
" \"\"\"\n",
" Given the real and imaginary parts of a complex number,\n",
" determine if it is a candidate for membership in the Mandelbrot\n",
" set given a fixed number of iterations.\n",
" \"\"\"\n",
" i = 0\n",
" c = complex(x, y)\n",
" z = 0.0j\n",
" for i in range(max_iters):\n",
" z = z**2 + c\n",
" if abs(z)**2 >= 4:\n",
" return i\n",
"\n",
" return 255\n",
"\n",
"@autojit\n",
"def create_fractal(min_x, max_x, min_y, max_y, image, iters):\n",
" height = image.shape[0]\n",
" width = image.shape[1]\n",
"\n",
" pixel_size_x = (max_x - min_x) / width\n",
" pixel_size_y = (max_y - min_y) / height\n",
" for x in range(width):\n",
" real = min_x + x * pixel_size_x\n",
" for y in range(height):\n",
" imag = min_y + y * pixel_size_y\n",
" color = mandel(real, imag, iters)\n",
" image[y, x] = color\n",
"\n",
" return image\n",
"\n",
"image = np.zeros((500, 750), dtype=np.uint8)\n",
"imshow(create_fractal(-2.0, 1.0, -1.0, 1.0, image, 20))\n",
"jet()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "display_data",
"png": "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\n"
}
],
"prompt_number": 26
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%timeit create_fractal(-2.0, 1.0, -1.0, 1.0, image, 20)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"1 loops, best of 3: 1.28 s per loop\n"
]
}
],
"prompt_number": 18
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%timeit create_fractal.py_func(-2.0, 1.0, -1.0, 1.0, image, 20)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"1 loops, best of 3: 18.9 s per loop\n"
]
}
],
"prompt_number": 19
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"18.9/ 1.28 # speedup of compiling outer-loop (inner-loop mandel call is still optimized)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 20,
"text": [
"14.765624999999998"
]
}
],
"prompt_number": 20
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Numba works very well for numerical calculations and infers types for variables. You can over-ride this inference by passing in a locals dictionary to the autojit decorator. Notice how the code below shows both Python object manipulation and native manipulation"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"class MyClass(object):\n",
" def mymethod(self, arg):\n",
" return arg * 2\n",
" \n",
"@autojit(locals=dict(mydouble=double)) # specify types for local variables\n",
"def call_method(obj):\n",
" print obj.mymethod(\"hello\") # object result\n",
" mydouble = obj.mymethod(10.2) # native double\n",
" print mydouble * 2 # native multiplication\n",
" \n",
"call_method(MyClass())"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"hellohello\n",
"40.8\n"
]
}
],
"prompt_number": 21
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Complex support is available as well."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"@autojit\n",
"def complex_support(real, imag):\n",
" c = complex(real, imag)\n",
" return (c ** 2).conjugate()\n",
"\n",
"c = 2.0 + 4.0j\n",
"complex_support(c.real, c.imag), (c**2).conjugate()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 22,
"text": [
"((-12-16j), (-12-16j))"
]
}
],
"prompt_number": 22
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can even create a function that takes a structured array as input."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from numba import struct, jit2\n",
"record_type = struct([('x', double), ('y', double)])\n",
"record_dtype = record_type.get_dtype()\n",
"a = np.array([(1.0, 2.0), (3.0, 4.0)], dtype=record_dtype)\n",
"\n",
"@jit2(argtypes=[record_type[:]])\n",
"def pyth(data):\n",
" result = np.empty_like(data, dtype=np.float64) # return types of numpy functions are inferred\n",
" for i in range(data.shape[0]):\n",
" result[i] = np.sqrt(data[i].x ** 2 + data[i].y ** 2)\n",
"\n",
" return result\n",
"\n",
"print pyth(a)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[ 2.23606798 5. ]\n"
]
}
],
"prompt_number": 23
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print pyth.signature # inspect function signature, note inferred return type"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"double[:] (*)(struct { double x, double y }[:])\n"
]
}
],
"prompt_number": 24
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"[line for line in str(pyth.lfunc).splitlines() if 'sqrt' in line] # note native math calls"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 25,
"text": [
"[' %90 = call double @llvm.sqrt.f64(double %89)']"
]
}
],
"prompt_number": 25
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The roadmap for Numba includes better error-handling, support for almost all Python syntax which gets compiled to code that either uses machine instructions or else the Python library run-time, improved support for basic types, and the ability to create objects easily. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The commercial product NumbaPro includes additional features:\n",
"\n",
"* ability to create ufuncs (fast-vectorize)\n",
"* ability to target the GPU via CUDA\n",
"* ability to target multiple-cores \n",
"* array-expressions (ability to write NumPy-like code that gets compiled)"
]
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment