你不能 jit bound 方法,但你可以 jit 未绑定的方法(但只能在对象模式下):
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
请注意,这不使用nopython 模式,因此您不应期望任何合理的加速。您可以将类本身设为jitclass(这意味着所有方法都不会自动进行python-jitted),但它需要您输入属性:
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())
但是对于更复杂的类,使用jitclass 将变得非常困难(或不可能)。以我的经验,最好的方法是从方法中简单地调用 jitted 函数:
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())
这取决于你的类和/或你的方法有多复杂,应该使用哪种方法。在您的情况下,我根本不会使用 numba,因为没有足够的计算昂贵的东西可以补偿 numba 和 jit 开销。如果它更复杂一点,我会使用jitclass,如果更复杂,我会使用从函数方法中调用的 jited-function。就我个人而言,我永远不会将jit 用于方法,因为这隐含需要对象模式,所以很可能jitted 函数比unjitted 函数慢。
顺便说一句:在 Python 中,您通常使用 property 而不是 get_* 或 set_* 函数...