如何在方法中使用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_*功能...