As an open source Python JITc, Numba is especially efficient with NumPy and other scientific computations.
It will be useful in the cases where:
a method is called really often
you love NumPy arrays
you want to perform some parallelization
Numba works by using a decorator on your methods. There is mainly two of them:
@njitwhich is an alias for
Simply import the decorator and add it to your methods:
from numba import njit @njit() def fast_slow_method(): # some time consuming action stuff()
That’s it !
Now you have more time to read a few more information ;)
Why a non-python mode exists when we are working with Python ?#
Great question and the answer is not that long. Numba is trying to provide a compiled version of the decorated method without using Python. But sometimes, Numba won’t be able to compile the code, for example if Pandas Dataframes are involved. In this case, the compiler will compile what he can and the interpreter will be called for the remaining code.
This is called the
So if you want best performances, always call
Okay but why is
@jit existing if it does not provide best performances ?
Because you may not want to receive an exception if the
@njit fails to provide a compiled method. You can see it as
“try to do as no-python and if you fail, fallback to hybrid mode”.
Ahead Of Time compilation (AOT compilation)#
If you read the doc (or StackOverflow answers) you may see stuff about methods signatures. This is only useful in the case of AOT compilation. For JITc Numba doesn’t care of signatures (not exactly but it won’t give you a performance boost).
Tips and tricks#
Some basic pitfalls that you may encounter of misc tips:
Always remember that Numba must “see the method” a first time, then the compiled version will be used
%timeitmeasure with a great deviation (or a deceiving result) may indicate this ;)
Try to maximize the use of NumPy arrays, it will spare you some time costly conversion
You can cache a jitted method with
Finally, head to the 5 minutes guide which is a nice starting point.