使用 numba.jit
在 python 。
我可以将普通函数转换为 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())
附言我也尝试过装饰器,它可以工作,但我不能将它用于导入的类(我自己没有定义的类),所以我正在研究这个。
最佳答案
你不能 jit 绑定(bind)方法,但您可以 jit 未绑定(bind)的方法(但仅限于对象模式):
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
模式,所以你不应该期望任何合理的加速。您可以将类(class)本身设为 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
如果它更复杂,我会使用从函数方法中调用的 jited 函数。就我个人而言,我永远不会使用 jit
对于一个方法,因为它隐含地需要对象模式,所以很可能 jitted 函数比 unjitted 函数慢。顺便说一句:在 Python 中,您通常使用
property
而不是 get_*
或 set_*
职能...
关于python - 如何通过方法使用 numba.jit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46808362/