Numba: Compiling Python Using Llvm The Way Webkit Compiles Javascript

In May, Apple announced a new feature in WebKit that added a fourth tier of speed optimization for JavaScript in Safari. In this new tier, JavaScript would be compiled to machine code (specifics aside). This kind of optimization (called FTL JIT) gave Webkit a 35% performance boost when compared to the third tier of optimization, pretty impressive.

It seems someone thought that JavaScript was getting all the love when it came to speed optimizations and thought Python should benefit from this idea as well. That became Numba. Numba allows Python developers to annotate any given segment in their code, that segment will be just-in-time (JIT) compiled using LLVM giving it, potentially, a 2 orders of magnitude improvement in speed!

# Code from http://numba.pydata.org
from numba import jit
from numpy import arange

# jit decorator tells Numba to compile this function.
# The argument types will be inferred by Numba when function is called.
@jit
def sum2d(arr):
    M, N = arr.shape
    result = 0.0
    for i in range(M):
        for j in range(N):
            result += arr[i,j]
    return result

a = arange(9).reshape(3,3)
print(sum2d(a))

After talking to someone who'd actually used Numba in their code, they say their code saw anywhere from 2x to 500x speed improvements depending on what they were doing (using regular, old vanilla Python). That's really impressive. I can't wait to try out Numba, and I think I have some very interesting use cases coming up where this might be the solution I've been looking for.


Filed under: python, javascript, llvm
Other Links: RSS Feed, JSON Feed, Status Page →