# 2.1。類型和簽名
> 原文: [http://numba.pydata.org/numba-doc/latest/reference/types.html](http://numba.pydata.org/numba-doc/latest/reference/types.html)
## 2.1.1。理由
作為優化編譯器,Numba 需要決定每個變量的類型以生成有效的機器代碼。 Python 的標準類型不夠精確,所以我們必須開發自己的細粒度類型系統。
在嘗試檢查 Numba 類型推斷的結果時,您會遇到 Numba 類型,用于[調試](envvars.html#numba-envvars)或[教育](../developer/architecture.html#architecture)目的。但是,如果提前編譯代碼 [](../user/pycc.html#pycc) ,則需要顯式使用類型。
## 2.1.2。簽名
簽名指定函數的類型。確切地說允許哪種簽名取決于上下文( [AOT](../glossary.html#term-aot) 或 [JIT](../glossary.html#term-jit) 編譯),但簽名總是涉及 Numba 類型的一些表示,以指定函數參數的具體類型,如果需要,函數的返回類型。
一個示例函數簽名是字符串`"f8(i4, i4)"`(或等價的`"float64(int32, int32)"`),它指定一個函數,它接受兩個 32 位整數并返回一個雙精度浮點數。
## 2.1.3。基本類型
最基本的類型可以通過簡單的表達式表達。下面的符號表示主`numba`模塊的屬性(因此,如果您讀取“boolean”,則表示符號可以作為`numba.boolean`訪問)。根據 Numpy 的慣例,許多類型都可以作為規范名稱和速記別名。
### 2.1.3.1。數字
下表包含 Numba 當前定義的基本數字類型及其別名。
| 輸入名稱 | 速記 | 評論 |
| --- | --- | --- |
| 布爾 | B1 | 表示為一個字節 |
| uint8,字節 | U1 | 8 位無符號字節 |
| UINT16 | U2 | 16 位無符號整數 |
| UINT32 | U4 | 32 位無符號整數 |
| UINT64 | U8 | 64 位無符號整數 |
| int8,char | I1 | 8 位有符號字節 |
| INT16 | I2 | 16 位有符號整數 |
| INT32 | I4 | 32 位有符號整數 |
| Int64 的 | I8 | 64 位有符號整數 |
| INTC | - | C int 大小的整數 |
| uintc | - | C int 大小的無符號整數 |
| INTP | - | 指針大小的整數 |
| uintp | - | 指針大小的無符號整數 |
| FLOAT32 | F4 | 單精度浮點數 |
| float64,double | F8 | 雙精度浮點數 |
| complex64 | C8 | 單精度復數 |
| complex128 | C16 | 雙精度復數 |
### 2.1.3.2。數組
聲明數組類型的簡單方法是根據維數來下標基本類型。例如,一維單精度數組:
```py
>>> numba.float32[:]
array(float32, 1d, A)
```
或相同底層類型的三維數組:
```py
>>> numba.float32[:, :, :]
array(float32, 3d, A)
```
此語法定義沒有特定布局的數組類型(生成接受非連續和連續數組的代碼),但您可以通過在索引規范的開頭或結尾使用`::1`索引來指定特定的連續性:
```py
>>> numba.float32[::1]
array(float32, 1d, C)
>>> numba.float32[:, :, ::1]
array(float32, 3d, C)
>>> numba.float32[::1, :, :]
array(float32, 3d, F)
```
### 2.1.3.3。其他類型
有些非數字類型不適合其他類別。
| 輸入名稱 | 評論 |
| --- | --- |
| 的 PyObject | 通用 Python 對象 |
| voidptr | 原始指針,不能對它執行任何操作 |
## 2.1.4。高級類型
對于更高級的聲明,您必須顯式調用 Numba 提供的輔助函數或類。
警告
此處記錄的 API 不保證穩定。除非必要,否則建議讓 Numba 使用@jit 的[無簽名變量來推斷參數類型。](../user/jit.html#jit-lazy)
### 2.1.4.1。推論
```py
numba.typeof(value)
```
創建一個 Numba 類型,準確描述給定的 Python _ 值 _。如果 [nopython 模式](../glossary.html#term-nopython-mode)不支持該值,則會引發`ValueError`。
```py
>>> numba.typeof(np.empty(3))
array(float64, 1d, C)
>>> numba.typeof((1, 2.0))
(int64, float64)
>>> numba.typeof([0])
reflected list(int64)
```
### 2.1.4.2。 Numpy 標量
除了使用 [`typeof()`](#numba.typeof "numba.typeof") 之外,還可以以編程方式構造諸如結構化類型之類的非平凡標量。
```py
numba.from_dtype(dtype)
```
創建與給定 Numpy _dtype_ 對應的 Numba 類型:
```py
>>> struct_dtype = np.dtype([('row', np.float64), ('col', np.float64)])
>>> ty = numba.from_dtype(struct_dtype)
>>> ty
Record([('row', '<f8'), ('col', '<f8')])
>>> ty[:, :]
unaligned array(Record([('row', '<f8'), ('col', '<f8')]), 2d, A)
```
```py
class numba.types.NPDatetime(unit)
```
為給定 _ 單位 _ 的 Numpy 日期時間創建 Numba 類型。 _ 單位 _ 應該是 Numpy 識別的代碼中的一個字符串(例如`Y`,`M`,`D`等)。
```py
class numba.types.NPTimedelta(unit)
```
為給定 _ 單位 _ 的 Numpy timedeltas 創建 Numba 類型。 _ 單位 _ 應該是 Numpy 識別的代碼中的一個字符串(例如`Y`,`M`,`D`等)。
也可以看看
Numpy [日期時間單位](http://docs.scipy.org/doc/numpy/reference/arrays.datetime.html#datetime-units)。
### 2.1.4.3。數組
```py
class numba.types.Array(dtype, ndim, layout)
```
創建一個數組類型。 _dtype_ 應該是 Numba 類型。 _ndim_ 是數組的維數(正整數)。 _ 布局 _ 是一個給出數組布局的字符串:`A`表示任何布局,`C`表示 C-contiguous,`F`表示 Fortran-contiguous。
### 2.1.4.4。可選類型
```py
class numba.optional(typ)
```
根據底層 Numba 類型 _typ_ 創建一個可選類型。可選類型將允許 _typ_ 或`None`的任何值。
```py
>>> @jit((optional(intp),))
... def f(x):
... return x is not None
...
>>> f(0)
True
>>> f(None)
False
```
- 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. 術語表