2.1。类型和签名
原文: http://numba.pydata.org/numba-doc/latest/reference/types.html
2.1.1。理由
作为优化编译器,Numba 需要决定每个变量的类型以生成有效的机器代码。 Python 的标准类型不够精确,所以我们必须开发自己的细粒度类型系统。
在尝试检查 Numba 类型推断的结果时,您会遇到 Numba 类型,用于调试或教育目的。但是,如果提前编译代码 ,则需要显式使用类型。
2.1.2。签名
签名指定函数的类型。确切地说允许哪种签名取决于上下文( AOT 或 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。数组
声明数组类型的简单方法是根据维数来下标基本类型。例如,一维单精度数组:
>>> 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 识别的代码中的一个字符串(例如Y
,M
,D
等)。
class numba.types.NPTimedelta(unit)
为给定 _ 单位 _ 的 Numpy timedeltas 创建 Numba 类型。 _ 单位 _ 应该是 Numpy 识别的代码中的一个字符串(例如Y
,M
,D
等)。
也可以看看
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 创建一个可选类型。可选类型将允许 typ 或None
的任何值。
>>> @jit((optional(intp),))
... def f(x):
... return x is not None
...
>>> f(0)
True
>>> f(None)
False