numba用户手册
提前编译代码AOT
--------------------------------------------------------------------------------------------------------------
6.1.说明:
1)Numba的主要用例是即时编译,还提供提前编译(AOT)的功能.
2)AOT编译生成一个不依赖于Numba已编译扩展模块:可在未装Numba的计算机上分发该模块(需Numpy)
3)运行时没有编译开销
6.2.局限性
1)AOT编译仅允许使用常规功能,而不能使用ufuncs;必须明确指定功能签名.
2)每个导出的函数只能有一个签名(但是您可以使用不同的名称导出几个不同的签名)
3) AOT编译为CPU体系结构系列生成通用代码,JIT编译为特定CPU模型生成优化的代码
--------------------------------------------------------------------------------------------------------------
# 实例1:
from numba.pycc import CC
cc = CC('my_module')
cc.verbose = True # 取消注释以下行,以打印出编译步骤
@cc.export('multf', 'f8(f8, f8)') # 双精度浮点
@cc.export('multi', 'i4(i4, i4)') # 32位整数
def mult(a, b):
return a * b
@cc.export('square', 'f8(f8)')
def square(a):
return a ** 2
if __name__ == "__main__": # 生成名为的扩展模块 my_module.pyd
cc.compile()
测试:
import my_module
my_module.multi(3, 4)#12
my_module.square(1.414) # 1.9993959999999997
--------------------------------------------------------------------------------------------------------------
6.2.Distutils集成
# setup.py用distutils或setuptools 将扩展模块编译步骤集成到脚本中:
# 实例2:
from distutils.core import setup
from source_module import cc
setup(..., ext_modules=[cc.distutils_extension()])#source_module是定义模块cc对象.
--------------------------------------------------------------------------------------------------------------
6.3.签名语法# 导出的签名的语法与@jit 装饰器中的语法相同.
# 实例3:
@cc.export('centdiff_1d', 'f8[:](f8[:], f8)')#'(f8[:], f8)'省略返回类型由Numba推断出来
def centdiff_1d(u, dx): #导出在一维数组上二阶差
D = np.empty_like(u)
D[0] = 0
D[-1] = 0
for i in range(1, len(D) - 1):
D[i] = (u[i+1] - 2 * u[i] + u[i-1]) / dx**2
return D
--------------------------------------------------------------------------------------------------------------