【问题标题】:Calling a non-jitted function from a numba jitted function从 numba jitted 函数调用非 jitted 函数
【发布时间】:2017-07-10 19:45:26
【问题描述】:

这就是我的代码的样子:

@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 函数。我该如何解决这个问题?

【问题讨论】:

    标签: python jit numba


    【解决方案1】:

    您不能从使用nopython=True 进行抖动处理的函数中调用非抖动函数。前者根据定义是一个python函数。您唯一真正的选择是将您自己的interp1d 版本编写为一个jitted 函数(同样使用nopython=True)。有时,通过查看原始 scipy 或 numpy 函数的来源,可以很容易地去除所需的功能。不幸的是,有时这非常困难。

    以下库可能会有所帮助:

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

    【讨论】:

    • 我确实尝试自己编写一个线性插值器,然后在其上使用 numba。但至少在试验数据上,scipy 插值器的工作速度明显快于我编写的线性插值器+numba。这可能是一种可能性还是这是否意味着我编写的插值器代码效率极低?感谢图书馆,我去看看。
    • 很难说为什么你的线性插值方案效率低于 scipy 中的方案而不看它,但我猜应该有可能得到一些在性能上非常相似的东西。
    猜你喜欢
    • 2017-08-18
    • 2021-02-22
    • 1970-01-01
    • 1970-01-01
    • 2019-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    相关资源
    最近更新 更多