编译带有使用其他内联函数的函数的 Numba 模块时出错

Fno*_*ord 3 python numpy numba

Numba 文档指定其他编译函数可以内联并从其他编译函数调用。提前编译时似乎并非如此。

例如:这里有两个函数计算两个向量数组之间的内部点积,其中一个执行实际的乘积,另一个在循环内进行内联调用:

# Module test.py
import numpy as np
from numba import njit, float64

@njit(float64(float64[:], float64[:]))
def product(a, b):
    prod = 0
    for i in range(a.size):
        prod += a[i] * b[i]
    return prod

@njit(float64[:](float64[:,:], float64[:,:]))
def n_inner1d(a, b):
    prod = np.empty(a.shape[0])    
    for i in range(a.shape[0]):
        prod[i] = product(a[i], b[i])

    return prod
Run Code Online (Sandbox Code Playgroud)

照原样,我可以完美地使用import test和使用。test.n_inner1d现在让我们做一些修改,以便可以将其编译为 .pyd

# Module test.py
import numpy as np
from numba import float64
from numba.pycc import CC

cc = CC('test')
cc.verbose = True

@cc.export('product','float64(float64[:], float64[:])')
def product(a, b):
    prod = 0
    for i in range(a.size):
        prod += a[i] * b[i]
    return prod

@cc.export('n_inner1d','float64[:](float64[:,:], float64[:,:])')
def n_inner1d(a, b):
    prod = np.empty(a.shape[0])    
    for i in range(a.shape[0]):
        prod[i] = product(a[i], b[i])

    return prod

if __name__ == "__main__":
    cc.compile()
Run Code Online (Sandbox Code Playgroud)

当尝试编译时,我收到以下错误:

# python test.py
Failed at nopython (nopython frontend)
Untyped global name 'product': cannot determine Numba type of <type 'function'>
File "test.py", line 20
Run Code Online (Sandbox Code Playgroud)

问题

对于已编译的模块ahead of time,其中定义的函数是否可以相互调用并内联使用?

Fno*_*ord 5

我联系了 numba 开发人员,他们友好地回答说,@njit在之后添加装饰器@cc.export将使函数调用类型解析工作并解析。

例如:

@cc.export('product','float64(float64[:], float64[:])')
@njit
def product(a, b):
    prod = 0
    for i in range(a.size):
        prod += a[i] * b[i]
    return prod
Run Code Online (Sandbox Code Playgroud)

将使该product功能可供其他人使用。需要注意的是,在某些情况下,内联函数完全有可能以与声明的 AOT 不同的类型签名结束。