如何在方法中使用numba.jit
问题描述:
在python中使用numba.jit
。如何在方法中使用numba.jit
我可以正常功能转换为JIT型和运行:
from numba import jit
def sum(a, b):
return a+b
func = jit(sum)
print(func(1, 2))
如何做到这一点的方法?像这样(这不起作用,我知道为什么)。
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.我也尝试装饰器,它的工作原理,但我不能用于导入类(我不定义自己),所以我正在研究这一点。
答
不能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_*
功能...