# 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
...
```
- 1. 用戶手冊
- 1.1。 Numba 的約 5 分鐘指南
- 1.2。概述
- 1.3。安裝
- 1.4。使用@jit 編譯 Python 代碼
- 1.5。使用@generated_jit 進行靈活的專業化
- 1.6。創建 Numpy 通用函數
- 1.7。用@jitclass 編譯 python 類
- 1.8。使用@cfunc 創建 C 回調
- 1.9。提前編譯代碼
- 1.10。使用@jit 自動并行化
- 1.11。使用@stencil裝飾器
- 1.12。從 JIT 代碼 中回調到 Python 解釋器
- 1.13。性能提示
- 1.14。線程層
- 1.15。故障排除和提示
- 1.16。常見問題
- 1.17。示例
- 1.18。會談和教程
- 2. 參考手冊
- 2.1。類型和簽名
- 2.2。即時編譯
- 2.3。提前編譯
- 2.4。公用事業
- 2.5。環境變量
- 2.6。支持的 Python 功能
- 2.7。支持的 NumPy 功能
- 2.8。與 Python 語義的偏差
- 2.9。浮點陷阱
- 2.10。 Python 2.7 壽命終止計劃
- 3. 用于 CUDA GPU 的 Numba
- 3.1。概述
- 3.2。編寫 CUDA 內核
- 3.3。內存管理
- 3.4。編寫設備功能
- 3.5。 CUDA Python 中支持的 Python 功能
- 3.6。支持的原子操作
- 3.7。隨機數生成
- 3.8。設備管理
- 3.10。示例
- 3.11。使用 CUDA 模擬器 調試 CUDA Python
- 3.12。 GPU 減少
- 3.13。 CUDA Ufuncs 和廣義 Ufuncs
- 3.14。共享 CUDA 內存
- 3.15。 CUDA 陣列接口
- 3.16。 CUDA 常見問題
- 4. CUDA Python 參考
- 4.1。 CUDA 主機 API
- 4.2。 CUDA 內核 API
- 4.3。內存管理
- 5. 用于 AMD ROC GPU 的 Numba
- 5.1。概述
- 5.2。編寫 HSA 內核
- 5.3。內存管理
- 5.4。編寫設備功能
- 5.5。支持的原子操作
- 5.6。代理商
- 5.7。 ROC Ufuncs 和廣義 Ufuncs
- 5.8。示例
- 6. 擴展 Numba
- 6.1。高級擴展 API
- 6.2。低級擴展 API
- 6.3。示例:間隔類型
- 7. 開發者手冊
- 7.1。貢獻給 Numba
- 7.2。 Numba 建筑
- 7.3。多態調度
- 7.4。關于發電機的注意事項
- 7.5。關于 Numba Runtime 的注意事項
- 7.6。使用 Numba Rewrite Pass 獲得樂趣和優化
- 7.7。實時變量分析
- 7.8。上市
- 7.9。模板注釋
- 7.10。關于自定義管道的注意事項
- 7.11。環境對象
- 7.12。哈希 的注意事項
- 7.13。 Numba 項目路線圖
- 8. Numba 增強建議
- 9. 術語表