不能JIT 束縛方法,但你可以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
(這意味着所有的方法都自動nopython,即時編譯),但它要求你輸入的屬性:
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
。在我的經驗,最好的辦法是簡單地從方法中調用即時編譯功能:
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
,如果它更復雜,我會使用從函數方法中調用的jitted函數。就個人而言,我永遠不會使用jit
作爲方法,因爲這隱含地要求對象模式,所以很可能jitted函數比unjitted函數慢。
順便說一句:在Python中,你通常使用property
代替get_*
或set_*
功能...