在numba中反映列表签名的问题

时间:2018-12-22 23:35:08

标签: python numba

我试图在我的一个功能上使用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)

如何修复我的签名,使其有效?谢谢

1 个答案:

答案 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)