Skip to content

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)

将装饰函数注册为键入可调用 funcfunc 可以是实际的 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)调用。 fromtytoty 分别是从和转换的具体类型。 _ 值 _ 是要转换的值。该函数必须返回与toty类型兼容的值。

6.2.2.2。常数

@lower_constant(typespec)

将装饰函数注册为实现 Numba typespec 的常量创建。使用四个参数(context, builder, ty, pyval)调用修饰函数。 ty 是为其创建常量的具体类型。 pyval 是转换为 LLVM 常量的 Python 值。该函数必须返回与ty类型兼容的值。

6.2.2.3。拳击和拆箱

在这些函数中, c 是一个具有多个属性的便利对象:

与本机值相反,对象是PyObject *指针。这些指针可以通过pyapi对象中的方法生成或处理。

@box(typespec)

将装饰函数注册为与 typespec 匹配的装箱值。使用三个参数(typ, val, c)调用修饰函数。 typ 是盒装的具体类型。 val 是装箱的值。该函数应返回 Python 对象,或 NULL 以表示错误。

@unbox(typespec)

将装饰函数注册为与 typespec 匹配的拆箱值。使用三个参数(typ, obj, c)调用修饰函数。 typ 是未装箱的具体类型。 obj 是未装箱的 Python 对象(C 语言中的PyObject *指针)。该函数应该返回一个NativeValue对象,给出取消装箱结果值和一个可选的错误位。


我们一直在努力

apachecn/AiLearning

【布客】中文翻译组