Python 使用其他内联函数编译带有函数的Numba模块时出错
在编译时,这似乎不是真的 例如:这里有两个函数计算两个向量数组之间的内积,其中一个计算实际积,另一个在循环中进行内联调用:Python 使用其他内联函数编译带有函数的Numba模块时出错,python,numpy,numba,Python,Numpy,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]
# 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
实际上,我可以很好地进行导入测试和使用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()
在尝试编译时,出现以下错误:
# python test.py
Failed at nopython (nopython frontend)
Untyped global name 'product': cannot determine Numba type of <type 'function'>
File "test.py", line 20
问题
对于编译的模块,在中定义的函数是否可以相互调用并内联使用?我联系了numba开发人员,他们友好地回答说,在@cc.export之后添加@njit decorator将使函数调用类型解析工作并解析 例如:
@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
将使产品功能可供其他人使用。需要注意的是,在某些情况下,内联函数最终可能与声明的AOT具有不同的类型签名