6.2。低级扩展 API
原文: http://numba.pydata.org/numba-doc/latest/extending/low-level.html
此扩展 API 可通过 numba.extending
模块获得。它允许您直接挂钩到 Numba 编译链。因此,它区分了几个编译阶段:
- 输入阶段通过查看执行的操作来推断编译函数中的变量类型。
- 降低阶段将高级 Python 操作转换为低级 LLVM 代码。此阶段利用由键入阶段导出的键入信息。
- _ 拳击 _ 和 _ 拆箱 _ 将 Python 对象转换为本机值,反之亦然。它们出现在从 Python 解释器调用 Numba 函数的边界。
6.2.1。输入
类型推断 - 或简单地 _ 输入 _ - 是将 Numba 类型分配给函数中涉及的所有值的过程,以便实现高效的代码生成。从广义上讲,键入有两种形式:键入普通 Python _ 值 (例如函数参数或全局变量)并在已知值类型上键入 _ 操作 (或 _ 函数 _) 。
@typeof_impl.register(cls)
将装饰函数注册为键入类 cls 的 Python 值。装饰函数将使用签名(val, c)
调用,其中 val 是键入的 Python 值, c 是上下文对象。
@type_callable(func)
将装饰函数注册为键入可调用 func 。 func 可以是实际的 Python 可调用函数,也可以是表示 Numba 内部已知的操作的字符串(例如'getitem'
)。使用单个 _ 上下文 _ 参数调用修饰函数,并且必须返回一个 typer 函数。 typer 函数应该与被键入的函数具有相同的签名,并且使用函数参数的 Numba _ 类型 _ 调用它;它应该返回函数返回值的 Numba 类型,或者如果推理失败则返回None
。
6.2.2。降低
以下装饰器都采用某种类型的规范。类型规范通常是类型类(例如types.Float
)或特定类型实例(例如types.float64
)。有些值具有特殊含义:
types.Any
匹配任何类型;这允许在实现中进行自己的调度types.VarArg(<some type>)
匹配给定类型的任意数量的参数;它只能在描述函数的参数时显示为最后一个类型规范。
以下 API 中的 _ 上下文 _ 参数是一个目标上下文,为代码生成提供各种实用程序方法(例如创建常量,从类型转换为另一种,查找特定函数的实现等) 。 _ 构建器 _ 参数是生成的 LLVM 代码的 llvmlite.ir.IRBuilder
实例。
_ 签名 _ 是指定操作的具体类型的对象。签名的args
属性是参数类型的元组。签名的return_type
属性是操作应返回的类型。
注意
Numba 总是以 Numba 类型为由,但在降低期间传递的值是 LLVM 值:它们不包含所需的类型信息,这也是 Numba 类型也被明确传递的原因。
LLVM 有自己的,非常低级的类型系统:您可以通过查找其.type
属性来访问值的 LLVM 类型。
6.2.2.1。原生作业
@lower_builtin(func, typespec, ...)
将装饰函数注册为为给定 Numba typespecs 描述的参数实现可调用 func 。与 type_callable()
一样, func 既可以是实际的 Python 可调用字符串,也可以是表示 Numba 内部已知的操作的字符串(例如'getitem'
)。
使用四个参数(context, builder, sig, args)
调用修饰函数。 sig
是调用 callable 的具体签名。 args
是调用 callable 的参数值的元组; args
中的每个值对应于sig.args
中的类型。该函数必须返回与sig.return_type
类型兼容的值。
@lower_getattr(typespec, name)
将装饰函数注册为实现给定 typespec 的属性 _ 名称 。使用四个参数(context, builder, typ, value)
调用修饰函数。 _typ 是正在查找属性的具体类型。 _ 值 _ 是要查找属性的值。
@lower_getattr_generic(typespec)
将装饰函数注册为给定 typespec 上的属性查找的后备。任何没有相应 lower_getattr()
声明的属性都将通过 lower_getattr_generic()
。使用五个参数(context, builder, typ, value, name)
调用修饰函数。 typ 和 _ 值 _ 与 lower_getattr()
相同。 _ 名称 _ 是要查找的属性的名称。
@lower_cast(fromspec, tospec)
将装饰函数注册为从 _ 从 specpec_ 描述的类型转换为 tospec 描述的类型。装饰函数使用五个参数(context, builder, fromty, toty, value)
调用。 fromty 和 toty 分别是从和转换的具体类型。 _ 值 _ 是要转换的值。该函数必须返回与toty
类型兼容的值。
6.2.2.2。常数
@lower_constant(typespec)
将装饰函数注册为实现 Numba typespec 的常量创建。使用四个参数(context, builder, ty, pyval)
调用修饰函数。 ty 是为其创建常量的具体类型。 pyval 是转换为 LLVM 常量的 Python 值。该函数必须返回与ty
类型兼容的值。
6.2.2.3。拳击和拆箱
在这些函数中, c 是一个具有多个属性的便利对象:
- 其
context
属性是上述目标上下文 - 其
builder
属性如上所述为llvmlite.ir.IRBuilder
- 它的
pyapi
属性是一个对象,可以访问 Python 解释器的 C API 的子集
与本机值相反,对象是PyObject *
指针。这些指针可以通过pyapi
对象中的方法生成或处理。
@box(typespec)
将装饰函数注册为与 typespec 匹配的装箱值。使用三个参数(typ, val, c)
调用修饰函数。 typ 是盒装的具体类型。 val 是装箱的值。该函数应返回 Python 对象,或 NULL 以表示错误。
@unbox(typespec)
将装饰函数注册为与 typespec 匹配的拆箱值。使用三个参数(typ, obj, c)
调用修饰函数。 typ 是未装箱的具体类型。 obj 是未装箱的 Python 对象(C 语言中的PyObject *
指针)。该函数应该返回一个NativeValue
对象,给出取消装箱结果值和一个可选的错误位。