从numba jitted函数调用非jitted函数

时间:2017-07-10 19:45:27

标签: python jit numba

所以这就是我的代码:

@jit(nopython=True)
def sum_fn(arg1, arg2, ...argn):
    .....
    for i in xrange(len(arg2)): #For each bin
        l, p = fn1(arg1, arg2...argn) 
        res = res + fn2(arg1, arg2, arg3) 
    return res

@jit(nopython=True)
def fn1(a1, a2,...an):
    ....
    return r1, r2

def fn2(l_lk, l_pk, l_lvals):
        f_i = interp1d(l_lk, l_pk,kind='linear') #Scipy.interpolate.interp1d
        ftmp = fn3(f_i,l_lk,l_pk)
        return 10**ftmp(l_lvals)

看起来调用fn2会产生错误,因为它没有被导入到numba编译过程中,这与fn1不同,后者是jitted。不幸的是,我不能jit fn2因为它使用了Numba无法识别的scipy.interpolate.interp1d函数。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

您无法在与nopython=True匹配的函数中调用非jitted函数。前者根据定义是一个python函数。您唯一真正的选择是将自己的interp1d版本编写为jitted函数(再次使用nopython=True)。有时通过查看原始scipy或numpy函数的源来删除所需的功能很简单。不幸的是,有时它很难。

以下库可能会有所帮助:

https://github.com/EconForge/interpolation.py