# 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. 术语表