Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用其他内联函数编译带有函数的Numba模块时出错_Python_Numpy_Numba - Fatal编程技术网

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具有不同的类型签名