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)
.
类型
我正在尝试对我的一个函数使用提前编译,因此我需要提供该函数的签名。当我使用 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)
.