Python 是否可以将类方法引用传递给njit函数?

Python 是否可以将类方法引用传递给njit函数?,python,class,reference,numba,Python,Class,Reference,Numba,我试图提高一些代码的计算时间。因此,我使用numba模块的njit装饰器来实现这一点。在本例中: import numpy as np from numba import jitclass, jit, njit from numba import int32, float64 import matplotlib.pyplot as plt import time spec = [('V_init' ,float64), ('a' ,float64), ('b'

我试图提高一些代码的计算时间。因此,我使用
numba
模块的
njit
装饰器来实现这一点。在本例中:

import numpy as np
from numba import jitclass, jit, njit
from numba import int32, float64
import matplotlib.pyplot as plt
import time

spec = [('V_init' ,float64),
        ('a' ,float64),
        ('b' ,float64),
        ('g',float64),
        ('dt' ,float64),
        ('NbODEs',int32),
        ('dydx' ,float64[:]),
        ('time' ,float64[:]),
        ('V' ,float64[:]),
        ('W' ,float64[:]),
        ('y'    ,float64[:]) ]

@jitclass(spec, )
class FHNfunc:
    def __init__(self,):
        self.V_init = .04
        self.a= 0.25
        self.b=0.001
        self.g = 0.003
        self.dt = .01
        self.NbODEs = 2
        self.dydx    =np.zeros(self.NbODEs  )
        self.y    =np.zeros(self.NbODEs  )

    def Eul(self,):
        self.deriv()
        self.y += (self.dydx * self.dt)

    def deriv(self,):
        self.dydx[0]= self.V_init - self.y[0] *(self.a-(self.y[0]))*(1-(self.y[0]))-self.y[1]
        self.dydx[1]= self.b * self.y[0] - self.g * self.y[1]
        return



@njit(fastmath=True)
def solve1(FH1,FHEuler,tp):
    V = np.zeros(len(tp), )
    W = np.zeros(len(tp), )

    for idx, t in enumerate(tp):
        FHEuler
        V[idx] = FH1.y[0]
        W[idx] = FH1.y[1]
    return V,W


if __name__ == "__main__":

    FH1 = FHNfunc()
    FHEuler = FH1.Eul

    dt = .01
    tp = np.linspace(0, 1000, num = int((1000)/dt))

    t0 = time.time()
    [V1,W1] = solve1(FH1,FHEuler,tp)
    print(time.time()- t0)
    plt.figure()
    plt.plot(tp,V1)
    plt.plot(tp,W1)
    plt.show()
我想传递一个名为
FHEuler=FH1.Eul
的类方法的引用,但是它崩溃了,并给出了这个错误

This error may have been caused by the following argument(s):
- argument 1: cannot determine Numba type of <class 'method'>
此错误可能是由以下参数引起的:
-参数1:无法确定一种类型的

那么,是否可以将引用传递给njit函数?还是存在解决方法?

Numba无法将函数作为参数处理。另一种方法是先编译函数,然后使用内部函数来处理其他参数,并返回内部函数,其中包含已编译的输入函数。请试试这个:

def solve1(FH1,FHEuler,tp):
    FHEuler_f = njit(FHEuler)
    @njit(fastmath=True)
    def inner(FH1_x, tp_x):
        V = np.zeros(len(tp_x), )
        W = np.zeros(len(tp_x), )
        for idx, t in enumerate(tp_x):
            FHEuler_f
            V[idx] = FH1_x.y[0]
            W[idx] = FH1_x.y[1]
        return V,W
    return inner(FH1, tp)
传递函数可能不是必需的。这个看起来有用

@njit(fastmath=True)
def solve1(FH1,tp):
    FHEuler = FH1.Eul
    V = np.zeros(len(tp), )
    W = np.zeros(len(tp), )

    for idx, t in enumerate(tp):
        FHEuler()
        V[idx] = FH1.y[0]
        W[idx] = FH1.y[1]
    return V,W

这是行不通的。如果我这样做,
FH1.Eul()
在调用
FHEuler=FH1.Eul()
时执行一次,
FH1.Eul()
,但在
solve1
函数中不再执行。@ymmx谢谢,答案已编辑,请再试一次。该答案没有给我任何错误,但输出只是零。这就好像Eul函数从来都不是called@ymmx这可能不是麻木的问题。在我看来,您的Eul函数所做的
self.y+=(self.dydx*self.dt)
看起来像
y=y0+0*something
,其中
y0=0
self.y=np.zero(self.NbODEs)
定义,即
0+0*something
,仍然是0。我猜你可能想修改这个function@ymmx实际上,我认为您不需要传递Eul方法,因为您已经传递了类。在正确修改Eul方法后,您可以尝试我的第二次更新