Using numba.jit
in python.
I can convert normal functions to jit-type and run:
from numba import jit
def sum(a, b):
return a+b
func = jit(sum)
print(func(1, 2))
How to do this to methods? Something like this (this doesn't work and I know why).
from numba import jit
class some_class:
def __init__(self, something = 0):
self.number = something
def get_num(self):
return self.number
my_object = some_class(5)
func = jit(my_object.get_num)
print(my_object.func())
P.S. I've also tried decorators, it works but I can't use it for imported classes (the ones that I don't define myself), so I'm looking into this.
You cannot jit bound methods, but you can jit unbound methods (but only in object-mode):
from numba import jit
class some_class:
def __init__(self, something = 0):
self.number = something
def get_num(self):
return self.number
func = jit(get_num)
my_object = some_class(5)
print(my_object.func())
# 5
Note that this doesn't use nopython
mode, so you shouldn't expect any reasonable speed-ups. You could make the class itself a jitclass
(that means all methods are nopython-jitted automatically) but it requires that you type the attributes:
import numba as nb
spec = [
('number', nb.int64),
]
@nb.jitclass(spec)
class some_class:
def __init__(self, something):
self.number = something
def get_num(self):
return self.number
my_object = some_class(5)
print(my_object.get_num())
But for more complicated classes it will become very hard (or impossible) to use jitclass
. In my experience the best way is to simply call the jitted functions from within the method:
from numba import njit # like jit but enforces nopython-mode!
@njit
def my_func(val):
return val # this example is a bit stupid, I hope your real code does more!
class some_class:
def __init__(self, something = 0):
self.number = something
def get_num(self):
return my_func(self.number)
my_object = some_class(5)
print(my_object.get_num())
It depends on how complex your class and/or your method is which approach should be used. In your case I wouldn't use numba at all because there's just not enough computationally expensive stuff that would compensate for the numba and jit overhead. If it were a bit more complicated I would use jitclass
and if it were much more complicated I would use the jitted-function that is called from within the function approach. Personally I would never use jit
for a method because that implicitly requires object-mode, so it's likely the jitted function is slower than the unjitted function.
By the way: In Python you generally use property
instead of get_*
or set_*
functions...
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With