Abh*_*hor 4 python jit class function-parameter numba
numba.jit在python中使用。
我可以将普通函数转换为jit类型并运行:
from numba import jit
def sum(a, b):
return a+b
func = jit(sum)
print(func(1, 2))
Run Code Online (Sandbox Code Playgroud)
如何做到这一点的方法?这样的事情(这不起作用,我知道为什么)。
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())
Run Code Online (Sandbox Code Playgroud)
PS我也尝试过装饰器,它可以工作,但是我不能将其用于导入的类(我自己没有定义的类),所以我正在研究这个。
您不能使用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
Run Code Online (Sandbox Code Playgroud)
请注意,这不使用nopython模式,因此您不应期望任何合理的加速。您可以将类本身设置为a 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())
Run Code Online (Sandbox Code Playgroud)
但是对于更复杂的类,将变得很难(或不可能)使用jitclass。以我的经验,最好的方法是从方法中简单地调用jited函数:
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())
Run Code Online (Sandbox Code Playgroud)
这取决于您使用的类和/或方法的复杂程度。在您的情况下,我根本不会使用numba,因为没有足够的计算上昂贵的东西来补偿numba和jit开销。如果比较复杂,我会使用jitclass,如果复杂得多,我将使用在函数方法中调用的jitted函数。就我个人而言,我永远不会使用jit方法,因为它隐式地需要对象模式,因此jitted函数可能比unjitted函数要慢。
顺便说一句:在Python中,您通常使用property代替get_*或set_*函数...