在python中使用numba.jit
。
我可以将普通函数转换为jit-type并运行:
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。我也尝试过装饰,但是我可以将它用于导入的课程(那些我不能自己定义的课程),所以我正在研究这个。
答案 0 :(得分:7)
你不能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-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
,如果它更复杂,我将使用从函数方法中调用的jitted函数。就个人而言,我永远不会使用jit
作为方法,因为这隐含地需要对象模式,所以jitted函数可能比unjitted函数慢。
顺便说一句:在Python中,您通常使用property
代替get_*
或set_*
函数...