我试图在我的一个功能上使用Ahead-of-Time编译,因此我需要提供该功能的签名。当我使用numba.typeof()
时,我会返回reflected list(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)
如何修复我的签名,使其有效?谢谢
答案 0 :(得分:1)
您需要正确指定list
的签名。这意味着要解决代码中的一些问题:
reflected=True
必须是您调用的List
类型类的参数list
。如果未导入,则它不是数字类型。如果确实将某些内容导入为list
,则将覆盖python内置模块list
。您应该从不执行此操作。因此,假设您使用nb.types.List(...)
导入numba,我会写import numba as nb
而不是列表。如果您使用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)
。