# 1.4。使用`@jit` 編譯 Python 代碼
> 原文: [http://numba.pydata.org/numba-doc/latest/user/jit.html](http://numba.pydata.org/numba-doc/latest/user/jit.html)
Numba 為代碼生成提供了幾個實用程序,但它的核心功能是 [`numba.jit()`](../reference/jit-compilation.html#numba.jit "numba.jit") 裝飾器。使用這個裝飾器,您可以通過 Numba 的 JIT 編譯器標記一個函數進行優化。各種調用模式會觸發不同的編譯選項和行為。
## 1.4.1。基本用法
### 1.4.1.1。懶惰編譯
使用`@jit`裝飾器的推薦方法是讓 Numba 決定何時以及如何優化:
```py
from numba import jit
@jit
def f(x, y):
# A somewhat trivial example
return x + y
```
在此模式下,編譯將推遲到第一個函數執行。 Numba 將在調用時推斷參數類型,并根據此信息生成優化代碼。 Numba 還可以根據輸入類型編譯單獨的特化。例如,使用整數或復數調用上面的`f()`函數將生成不同的代碼路徑:
```py
>>> f(1, 2)
3
>>> f(1j, 2)
(2+1j)
```
### 1.4.1.2。急切的編譯
您還可以告訴 Numba 您期望的功能簽名。函數`f()`現在看起來像:
```py
from numba import jit, int32
@jit(int32(int32, int32))
def f(x, y):
# A somewhat trivial example
return x + y
```
`int32(int32, int32)`是函數的簽名。在這種情況下,相應的特化將由`@jit`裝飾器編譯,并且不允許其他專門化。如果您希望對編譯器選擇的類型進行細粒度控制(例如,使用單精度浮點數),這將非常有用。
如果省略返回類型,例如通過寫`(int32, int32)`而不是`int32(int32, int32)`,Numba 將嘗試為您推斷它。函數簽名也可以是字符串,您可以將其中的幾個作為列表傳遞;有關詳細信息,請參閱 [`numba.jit()`](../reference/jit-compilation.html#numba.jit "numba.jit") 文檔。
當然,編譯的函數給出了預期的結果:
```py
>>> f(1,2)
3
```
如果我們將`int32`指定為返回類型,則高位位被丟棄:
```py
>>> f(2**31, 2**31 + 1)
1
```
## 1.4.2。調用和內聯其他功能
Numba 編譯的函數可以調用其他編譯函數。函數調用甚至可以在本機代碼中內聯,具體取決于優化器啟發式。例如:
```py
@jit
def square(x):
return x ** 2
@jit
def hypot(x, y):
return math.sqrt(square(x) + square(y))
```
`@jit`裝飾器 _ 必須將 _ 添加到任何此類庫函數中,否則 Numba 可能會生成更慢的代碼。
## 1.4.3。簽名規格
顯式`@jit`簽名可以使用多種類型。以下是一些常見的:
* `void`是沒有返回任何內容的函數的返回類型(從 Python 調用時實際返回`None`)
* `intp`和`uintp`是指針大小的整數(分別是有符號和無符號)
* `intc`和`uintc`相當于 C `int`和`unsigned int`整數類型
* `int8`,`uint8`,`int16`,`uint16`,`int32`,`uint32`,`int64`,`uint64`是相應位寬的有限寬度整數(有符號和無符號)
* `float32`和`float64`分別是單精度和雙精度浮點數
* `complex64`和`complex128`分別是單精度和雙精度復數
* 數組類型可以通過索引任何數字類型來指定,例如一維單精度數組的`float32[:]`或 8 位整數的二維數組的`int8[:,:]`。
## 1.4.4。編譯選項
可以將許多僅關鍵字參數傳遞給`@jit`裝飾器。
### 1.4.4.1。 `nopython`
Numba 有兩種編譯模式: [nopython 模式](../glossary.html#term-nopython-mode)和[對象模式](../glossary.html#term-object-mode)。前者產生更快的代碼,但有一些限制可以迫使 Numba 回到后者。為防止 Numba 退回,而是引發錯誤,請傳遞`nopython=True`。
```py
@jit(nopython=True)
def f(x, y):
return x + y
```
也可以看看
[故障排除和提示](troubleshoot.html#numba-troubleshooting)
### 1.4.4.2。 `nogil`
每當 Numba 將 Python 代碼優化為僅適用于本機類型和變量(而不是 Python 對象)的本機代碼時,就不再需要持有 Python 的[全局解釋器鎖](https://docs.python.org/3/glossary.html#term-global-interpreter-lock "(in Python v3.7)")(GIL)。如果您通過`nogil=True`,Numba 將在輸入此類編譯函數時釋放 GIL。
```py
@jit(nogil=True)
def f(x, y):
return x + y
```
使用 GIL 發布的代碼與執行 Python 或 Numba 代碼的其他線程(相同的編譯函數或其他代碼)同時運行,允許您利用多核系統。如果在[對象模式](../glossary.html#term-object-mode)中編譯該功能,則無法進行此操作。
使用`nogil=True`時,您必須警惕多線程編程的常見缺陷(一致性,同步,競爭條件等)。
### 1.4.4.3。 `cache`
為了避免每次調用 Python 程序時的編譯時間,可以指示 Numba 將函數編譯的結果寫入基于文件的緩存中。這是通過傳遞`cache=True`來完成的:
```py
@jit(cache=True)
def f(x, y):
return x + y
```
### 1.4.4.4。 `parallel`
為已知具有并行語義的函數中的那些操作啟用自動并行化(和相關優化)。有關支持的操作列表,請參閱[使用@jit](parallel.html#numba-parallel) 自動并行化。通過`parallel=True`啟用此功能,必須與`nopython=True`一起使用:
```py
@jit(nopython=True, parallel=True)
def f(x, y):
return x + y
```
也可以看看
[使用@jit](parallel.html#numba-parallel) 自動并行化
- 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. 術語表