💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# 1.9。提前编译代码 > 原文: [http://numba.pydata.org/numba-doc/latest/user/pycc.html](http://numba.pydata.org/numba-doc/latest/user/pycc.html) 虽然 Numba 的主要用例是[即时编译](../glossary.html#term-just-in-time-compilation),但它也为[提前编译](../glossary.html#term-ahead-of-time-compilation)(AOT)提供了便利。 ## 1.9.1。概述 ### 1.9.1.1。好处 1. AOT 编译生成一个编译的扩展模块,它不依赖于 Numba:您可以在没有安装 Numba 的机器上分发模块(但需要 Numpy)。 2. 运行时没有编译开销(但请参阅`@jit` [缓存](jit.html#jit-cache)选项),也没有导入 Numba 的任何开销。 也可以看看 编译的扩展模块在 [Python 打包用户指南](https://packaging.python.org/en/latest/extensions/)中讨论。 ### 1.9.1.2。限制 1. AOT 编译只允许常规功能,而不是 [ufuncs](../glossary.html#term-ufunc) 。 2. 您必须明确指定功能签名。 3. 每个导出的函数只能有一个签名(但您可以使用不同的名称导出多个不同的签名)。 4. AOT 编译为您的 CPU 架构系列生成通用代码(例如“x86-64”),而 JIT 编译生成针对您的特定 CPU 模型优化的代码。 ## 1.9.2。用法 ### 1.9.2.1。独立示例 ```py from numba.pycc import CC cc = CC('my_module') # Uncomment the following line to print out the compilation steps #cc.verbose = True @cc.export('multf', 'f8(f8, f8)') @cc.export('multi', 'i4(i4, i4)') def mult(a, b): return a * b @cc.export('square', 'f8(f8)') def square(a): return a ** 2 if __name__ == "__main__": cc.compile() ``` 如果您运行此 Python 脚本,它将生成名为`my_module`的扩展模块。根据您的平台,实际文件名可能是`my_module.so`,`my_module.pyd`,`my_module.cpython-34m.so`等。 生成的模块有三个功能:`multf`,`multi`和`square`。 `multi`以 32 位整数(`i4`)运行,而`multf`和`square`以双精度浮点运算(`f8`): ```py >>> import my_module >>> my_module.multi(3, 4) 12 >>> my_module.square(1.414) 1.9993959999999997 ``` ### 1.9.2.2。 Distutils 整合 您还可以使用 distutils 或 setuptools 在`setup.py`脚本中集成扩展模块的编译步骤: ```py from distutils.core import setup from source_module import cc setup(..., ext_modules=[cc.distutils_extension()]) ``` 上面的`source_module`是定义`cc`对象的模块。像这样编译的扩展会自动包含在 Python 项目的构建文件中,因此您可以将它们分发到二进制包(如 wheel 或 Conda 包)中。请注意,在使用 conda 的情况下,用于 AOT 的编译器需要是 Anaconda 发行版中可用的编译器。 ### 1.9.2.3。签名语法 导出签名的语法与`@jit`装饰器中的语法相同。您可以在[类型](../reference/types.html#numba-types)参考中阅读更多相关信息。 以下是在 1d 数组上导出二阶中心差异的实现的示例: ```py @cc.export('centdiff_1d', 'f8[:](f8[:], f8)') 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 ``` 您也可以省略返回类型,然后由 Numba 推断: ```py @cc.export('centdiff_1d', '(f8[:], f8)') def centdiff_1d(u, dx): # Same code as above ... ```