numba 中反射列表签名的问题

Problem with reflected list signature in numba

我正在尝试对我的一个函数使用提前编译,因此我需要提供该函数的签名。当我使用 numba.typeof() 时,我返回 reflected list(array(float64, 2d, A)) 作为我的一个变量。我查看了此线程 以尝试找出签名,但我 运行 出错了。

在尝试让 AOT 编译工作之前,我只是想让@njit 处理签名。

我试过:

@njit(float64[:,:,:](int32, list(float64), float64[:,:,:]), reflected=True)

我怎样才能修改我的签名使其正常工作?谢谢

您需要正确指定 list 的签名。这意味着解决您代码中的一些问题:

  • reflected=True 必须是您调用 List 类型 class
  • 的参数
  • 我不知道你如何以及在哪里导入 list。如果您没有导入它,则它不是 numba 类型。如果您确实将某些内容导入为 list,则您覆盖了 python 内置模块 list。你应该永远这样做。因此,我会写 nb.types.List(...) 而不是列表,假设您使用 import numba as nb 导入 numba。如果您使用 from numba import * 导入了 numba:这是您应该不惜一切代价避免的另一件事。
  • 存储在列表中的 float64 类型需要更精确地指定。您的反射列表中有一个 array(float64, 2d, A) 类型的数组。这意味着您的列表签名需要恰好包含此数组类型。在这种情况下,它看起来像:nb.float64[:, :]。对于 C- 或 F- 等其他内存布局,请查看 this post.

因此您生成的签名将如下所示:

@nb.njit(nb.float64[:, :, :](nb.int32, nb.types.List(nb.float64[:, :], reflected=True), nb.float64[:, :, :]))

再次假设您使用 import numba as nb 导入 numba 并且您的数组是 array(float64, 2d, A).

类型