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,其中定义的函数是否可以相互调用并内联使用?
我联系了 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 不同的类型签名结束。
| 归档时间: |
|
| 查看次数: |
1476 次 |
| 最近记录: |