首页 > 解决方案 > numba 中反射列表签名的问题

问题描述

我正在尝试在我的一个函数上使用 Ahead-of-Time 编译,因此我需要为该函数提供签名。当我使用时,numba.typeof()我会返回reflected list(array(float64, 2d, A))我的一个变量。我看过这个线程Basic Trouble with Python lists in Numba;这是怎么回事?试图找出签名,但我一直遇到错误。

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

我试过了:

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

如何修复我的签名以使其正常工作?谢谢

标签: pythonnumba

解决方案


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

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

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

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

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


推荐阅读