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。数组

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

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

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

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

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

  1. >>> numba.float32[::1]
  2. array(float32, 1d, C)
  3. >>> numba.float32[:, :, ::1]
  4. array(float32, 3d, C)
  5. >>> numba.float32[::1, :, :]
  6. array(float32, 3d, F)

2.1.3.3。其他类型

有些非数字类型不适合其他类别。

输入名称 评论
的 PyObject 通用 Python 对象
voidptr 原始指针,不能对它执行任何操作

2.1.4。高级类型

对于更高级的声明,您必须显式调用 Numba 提供的辅助函数或类。

警告

此处记录的 API 不保证稳定。除非必要,否则建议让 Numba 使用@jit 的无签名变量来推断参数类型。

2.1.4.1。推论

  1. numba.typeof(value)

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

  1. >>> numba.typeof(np.empty(3))
  2. array(float64, 1d, C)
  3. >>> numba.typeof((1, 2.0))
  4. (int64, float64)
  5. >>> numba.typeof([0])
  6. reflected list(int64)

2.1.4.2。 Numpy 标量

除了使用 typeof() 之外,还可以以编程方式构造诸如结构化类型之类的非平凡标量。

  1. numba.from_dtype(dtype)

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

  1. >>> struct_dtype = np.dtype([('row', np.float64), ('col', np.float64)])
  2. >>> ty = numba.from_dtype(struct_dtype)
  3. >>> ty
  4. Record([('row', '<f8'), ('col', '<f8')])
  5. >>> ty[:, :]
  6. unaligned array(Record([('row', '<f8'), ('col', '<f8')]), 2d, A)
  1. class numba.types.NPDatetime(unit)

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

  1. class numba.types.NPTimedelta(unit)

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

也可以看看

Numpy 日期时间单位

2.1.4.3。数组

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

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

2.1.4.4。可选类型

  1. class numba.optional(typ)

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

  1. >>> @jit((optional(intp),))
  2. ... def f(x):
  3. ... return x is not None
  4. ...
  5. >>> f(0)
  6. True
  7. >>> f(None)
  8. False