-
-
Save sklam/4aaea63e8c3f90373f7e to your computer and use it in GitHub Desktop.
Update notebook to numba 0.18.2
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Populating the interactive namespace from numpy and matplotlib\n" | |
] | |
} | |
], | |
"source": [ | |
"from __future__ import print_function\n", | |
"\n", | |
"%pylab inline" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"0.18.2\n" | |
] | |
} | |
], | |
"source": [ | |
"import numpy as np\n", | |
"from numba import jit, __version__\n", | |
"\n", | |
"print(__version__)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Numba provides a major decorator: `jit`\n", | |
"\n", | |
"The `jit` decorator returns a compiled version of the function using the input types and the output types of the function. 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. Optionally, you can specify the type using `out_type(in_type, ...)` syntax. Array inputs can be specified using `[:,:]` appended to the type. " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"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", | |
"\n", | |
"fastsum = jit('f8(f8[:,:])')(sum)\n", | |
"flexsum = jit(sum)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"179700.0\n", | |
"179700.0\n", | |
"179700.0\n", | |
"179700.0\n" | |
] | |
} | |
], | |
"source": [ | |
"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)))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"10000 loops, best of 3: 133 µs per loop\n" | |
] | |
} | |
], | |
"source": [ | |
"sum_timeit = %timeit -o sum(arr2d)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"The slowest run took 7.92 times longer than the fastest. This could mean that an intermediate result is being cached \n", | |
"1000000 loops, best of 3: 708 ns per loop\n" | |
] | |
} | |
], | |
"source": [ | |
"fastsum_timeit = %timeit -o fastsum(arr2d)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"188.15332705347848" | |
] | |
}, | |
"execution_count": 7, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"sum_timeit.best / fastsum_timeit.best # speedup" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"The slowest run took 15.43 times longer than the fastest. This could mean that an intermediate result is being cached \n", | |
"100000 loops, best of 3: 3.82 µs per loop\n" | |
] | |
} | |
], | |
"source": [ | |
"arr2d_sum_timeit = %timeit -o arr2d.sum() " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"5.401072373949704" | |
] | |
}, | |
"execution_count": 9, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"arr2d_sum_timeit.best / fastsum_timeit.best # even provides a speedup over general-purpose NumPy surm" | |
] | |
}, | |
{ | |
"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", | |
"execution_count": 10, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Python: 1.108098 s; Numba: 157.517910 ms; Speed up is 7.034743\n" | |
] | |
}, | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x110f0b898>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"@jit\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))" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"You can call Numba-created functions from other Numba-created functions" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 11, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x110dbeb00>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"@jit\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", | |
"@jit\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()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 12, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"10 loops, best of 3: 21.4 ms per loop\n" | |
] | |
} | |
], | |
"source": [ | |
"fast_fractal_timeit = %timeit -o create_fractal(-2.0, 1.0, -1.0, 1.0, image, 20)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 13, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"1 loops, best of 3: 197 ms per loop\n" | |
] | |
} | |
], | |
"source": [ | |
"python_fractal_timeit = %timeit -o create_fractal.py_func(-2.0, 1.0, -1.0, 1.0, image, 20)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 14, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"9.227083778764213" | |
] | |
}, | |
"execution_count": 14, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"python_fractal_timeit.best / fast_fractal_timeit.best # speedup of compiling outer-loop (inner-loop mandel call is still optimized)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Complex support is available as well." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 15, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"((-12-16j), (-12-16j))" | |
] | |
}, | |
"execution_count": 15, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"@jit\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()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"We can even create a function that takes a structured array as input." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 16, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"[ 2.23606798 5. ]\n" | |
] | |
} | |
], | |
"source": [ | |
"record_dtype = np.dtype([('x', double), ('y', double)])\n", | |
"a = np.array([(1.0, 2.0), (3.0, 4.0)], dtype=record_dtype)\n", | |
"\n", | |
"@jit\n", | |
"def pyth(data):\n", | |
" result = np.empty_like(data, dtype=np.float64) \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))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 17, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"pyth (array(Record([('x', '<f8'), ('y', '<f8')]), 1d, C),)\n", | |
"--------------------------------------------------------------------------------\n", | |
"# File: <ipython-input-16-9177f82a7f2d>\n", | |
"# --- LINE 4 --- \n", | |
"\n", | |
"@jit\n", | |
"\n", | |
"# --- LINE 5 --- \n", | |
"\n", | |
"def pyth(data):\n", | |
"\n", | |
" # --- LINE 6 --- \n", | |
" # label 0\n", | |
" # data = arg(0, name=data) :: pyobject\n", | |
" # $0.1 = global(np: <module 'numpy' from '/Users/sklam/dev/.conda.workspace/numbapro_dist/lib/python3.4/site-packages/numpy/__init__.py'>) :: pyobject\n", | |
" # $0.2 = getattr(value=$0.1, attr=empty_like) :: pyobject\n", | |
" # del $0.1\n", | |
" # $0.5 = global(np: <module 'numpy' from '/Users/sklam/dev/.conda.workspace/numbapro_dist/lib/python3.4/site-packages/numpy/__init__.py'>) :: pyobject\n", | |
" # $0.6 = getattr(value=$0.5, attr=float64) :: pyobject\n", | |
" # del $0.5\n", | |
" # $0.7 = call $0.2(data, dtype=$0.6) :: pyobject\n", | |
" # del $0.6\n", | |
" # del $0.2\n", | |
" # result = $0.7 :: pyobject\n", | |
" # del $0.7\n", | |
"\n", | |
" result = np.empty_like(data, dtype=np.float64)\n", | |
"\n", | |
" # --- LINE 7 --- \n", | |
" # jump 27.1\n", | |
" # label 27.1\n", | |
" # $const27.1.1 = const(LiftedLoop, LiftedLoop(<function pyth at 0x111a2e378>)) :: XXX Lifted Loop XXX\n", | |
" # $27.1.4 = call $const27.1.1(result, data, ) :: XXX Lifted Loop XXX\n", | |
" # del data\n", | |
" # del $const27.1.1\n", | |
" # del $27.1.4\n", | |
" # jump 99\n", | |
"\n", | |
" for i in range(data.shape[0]):\n", | |
"\n", | |
" # --- LINE 8 --- \n", | |
"\n", | |
" result[i] = np.sqrt(data[i].x ** 2 + data[i].y ** 2)\n", | |
"\n", | |
"# --- LINE 9 --- \n", | |
"\n", | |
"\n", | |
"\n", | |
" # --- LINE 10 --- \n", | |
" # label 99\n", | |
" # $99.2 = cast(value=result) :: pyobject\n", | |
" # del result\n", | |
" # return $99.2\n", | |
"\n", | |
" return result\n", | |
"\n", | |
"# The function contains lifted loops\n", | |
"# Loop at line 7\n", | |
"# Has 1 overloads\n", | |
"# File: <ipython-input-16-9177f82a7f2d>\n", | |
"# --- LINE 4 --- \n", | |
"\n", | |
"@jit\n", | |
"\n", | |
"# --- LINE 5 --- \n", | |
"\n", | |
"def pyth(data):\n", | |
"\n", | |
" # --- LINE 6 --- \n", | |
"\n", | |
" result = np.empty_like(data, dtype=np.float64)\n", | |
"\n", | |
" # --- LINE 7 --- \n", | |
" # label 24\n", | |
" # result = arg(0, name=result) :: array(float64, 1d, C)\n", | |
" # data = arg(1, name=data) :: array(Record([('x', '<f8'), ('y', '<f8')]), 1d, C)\n", | |
" # $24.1 = global(range: <class 'range'>) :: range\n", | |
" # $24.3 = getattr(value=data, attr=shape) :: (int64 x 1)\n", | |
" # $const24.4 = const(int, 0) :: int32\n", | |
" # $24.5 = getitem(value=$24.3, index=$const24.4) :: int64\n", | |
" # del $const24.4\n", | |
" # del $24.3\n", | |
" # $24.6 = call $24.1($24.5, ) :: (int64,) -> range_state64\n", | |
" # del $24.5\n", | |
" # del $24.1\n", | |
" # $24.7 = getiter(value=$24.6) :: range_iter64\n", | |
" # del $24.6\n", | |
" # $phi44.1 = $24.7 :: range_iter64\n", | |
" # del $24.7\n", | |
" # jump 44\n", | |
" # label 44\n", | |
" # $44.2 = iternext(value=$phi44.1) :: pair<int64, bool>\n", | |
" # $44.3 = pair_first(value=$44.2) :: int64\n", | |
" # $44.4 = pair_second(value=$44.2) :: bool\n", | |
" # del $44.2\n", | |
" # $phi47.1 = $44.3 :: int64\n", | |
" # del $44.3\n", | |
" # branch $44.4, 47, 98\n", | |
" # label 47\n", | |
" # i = $phi47.1 :: int64\n", | |
" # del $phi47.1\n", | |
"\n", | |
" for i in range(data.shape[0]):\n", | |
"\n", | |
" # --- LINE 8 --- \n", | |
" # $47.2 = global(np: <module 'numpy' from '/Users/sklam/dev/.conda.workspace/numbapro_dist/lib/python3.4/site-packages/numpy/__init__.py'>) :: Module(<module 'numpy' from '/Users/sklam/dev/.conda.workspace/numbapro_dist/lib/python3.4/site-packages/numpy/__init__.py'>)\n", | |
" # $47.3 = getattr(value=$47.2, attr=sqrt) :: Function(<ufunc 'sqrt'>)\n", | |
" # del $47.2\n", | |
" # $47.6 = getitem(value=data, index=i) :: Record([('x', '<f8'), ('y', '<f8')])\n", | |
" # $47.7 = getattr(value=$47.6, attr=x) :: float64\n", | |
" # del $47.6\n", | |
" # $const47.8 = const(int, 2) :: int32\n", | |
" # $47.9 = $47.7 ** $const47.8 :: float64\n", | |
" # del $const47.8\n", | |
" # del $47.7\n", | |
" # $47.12 = getitem(value=data, index=i) :: Record([('x', '<f8'), ('y', '<f8')])\n", | |
" # $47.13 = getattr(value=$47.12, attr=y) :: float64\n", | |
" # del $47.12\n", | |
" # $const47.14 = const(int, 2) :: int32\n", | |
" # $47.15 = $47.13 ** $const47.14 :: float64\n", | |
" # del $const47.14\n", | |
" # del $47.13\n", | |
" # $47.16 = $47.9 + $47.15 :: float64\n", | |
" # del $47.9\n", | |
" # del $47.15\n", | |
" # $47.17 = call $47.3($47.16, ) :: (float64,) -> float64\n", | |
" # del $47.3\n", | |
" # del $47.16\n", | |
" # result[i] = $47.17 :: (array(float64, 1d, C), int64, float64) -> none\n", | |
" # del i\n", | |
" # del $47.17\n", | |
" # jump 44\n", | |
" # label 98\n", | |
" # del result\n", | |
" # del data\n", | |
" # del $phi47.1\n", | |
" # del $phi44.1\n", | |
" # del $44.4\n", | |
" # jump 99\n", | |
" # label 99\n", | |
" # $const99.1 = const(NoneType, None) :: none\n", | |
" # $99.2 = cast(value=$const99.1) :: none\n", | |
" # del $const99.1\n", | |
" # return $99.2\n", | |
"\n", | |
" result[i] = np.sqrt(data[i].x ** 2 + data[i].y ** 2)\n", | |
"\n", | |
"# --- LINE 9 --- \n", | |
"\n", | |
"\n", | |
"\n", | |
" # --- LINE 10 --- \n", | |
"\n", | |
" return result\n", | |
"\n", | |
"\n", | |
"\n", | |
"================================================================================\n" | |
] | |
} | |
], | |
"source": [ | |
"pyth.inspect_types() # inspect inferred types" | |
] | |
}, | |
{ | |
"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, improve support for numpy array operations and classes." | |
] | |
} | |
], | |
"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.4.3" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 0 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment