我正在尝试对我的一个函数使用提前编译,因此我需要提供该函数的签名。当我使用 numba.typeof() 时,我会返回一个变量的反射列表(array(float64, 2d, A)) 。我看过这个帖子Basic trouble with Python lists in Numba; what's going on?尝试找出签名,但我遇到了错误。
在尝试让 AOT 编译工作之前,我只是想让 @njit 使用签名。
我已经尝试过:
@njit(float64[:,:,:](int32, list(float64), float64[:,:,:]), reflected=True)
如何修复我的签名以使其正常工作?谢谢
最佳答案
您需要正确指定列表
的签名。这意味着解决代码中的一些问题:
reflected=True
必须是调用List
类型类的参数- 我不知道如何以及在何处导入
list
。如果您没有导入它,则它不是 numba 类型。如果您确实将某些内容导入为list
,那么您就覆盖了 python 内置模块list
。您不应该永远这样做。因此,我会编写nb.types.List(...)
而不是 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)
。
关于python - numba 中反射列表签名的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53900084/