Skip to content

Latest commit

 

History

History
172 lines (118 loc) · 5.38 KB

31.md

File metadata and controls

172 lines (118 loc) · 5.38 KB

2.1。类型和签名

原文: http://numba.pydata.org/numba-doc/latest/reference/types.html

2.1.1。理由

作为优化编译器,Numba 需要决定每个变量的类型以生成有效的机器代码。 Python 的标准类型不够精确,所以我们必须开发自己的细粒度类型系统。

在尝试检查 Numba 类型推断的结果时,您会遇到 Numba 类型,用于调试教育目的。但是,如果提前编译代码 ,则需要显式使用类型。

2.1.2。签名

签名指定函数的类型。确切地说允许哪种签名取决于上下文( AOTJIT 编译),但签名总是涉及 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。数组

声明数组类型的简单方法是根据维数来下标基本类型。例如,一维单精度数组:

>>> numba.float32[:]
array(float32, 1d, A)

或相同底层类型的三维数组:

>>> numba.float32[:, :, :]
array(float32, 3d, A)

此语法定义没有特定布局的数组类型(生成接受非连续和连续数组的代码),但您可以通过在索引规范的开头或结尾使用::1索引来指定特定的连续性:

>>> 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 的无签名变量来推断参数类型。

2.1.4.1。推论

numba.typeof(value)

创建一个 Numba 类型,准确描述给定的 Python _ 值 _。如果 nopython 模式不支持该值,则会引发ValueError

>>> 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.from_dtype(dtype)

创建与给定 Numpy dtype 对应的 Numba 类型:

>>> 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)
class numba.types.NPDatetime(unit)

为给定 _ 单位 _ 的 Numpy 日期时间创建 Numba 类型。 _ 单位 _ 应该是 Numpy 识别的代码中的一个字符串(例如YMD等)。

class numba.types.NPTimedelta(unit)

为给定 _ 单位 _ 的 Numpy timedeltas 创建 Numba 类型。 _ 单位 _ 应该是 Numpy 识别的代码中的一个字符串(例如YMD等)。

也可以看看

Numpy 日期时间单位

2.1.4.3。数组

class numba.types.Array(dtype, ndim, layout)

创建一个数组类型。 dtype 应该是 Numba 类型。 ndim 是数组的维数(正整数)。 _ 布局 _ 是一个给出数组布局的字符串:A表示任何布局,C表示 C-contiguous,F表示 Fortran-contiguous。

2.1.4.4。可选类型

class numba.optional(typ)

根据底层 Numba 类型 typ 创建一个可选类型。可选类型将允许 typNone的任何值。

>>> @jit((optional(intp),))
... def f(x):
...     return x is not None
...
>>> f(0)
True
>>> f(None)
False