ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 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 ```