关闭 Numba 中的列表反射

Ale*_*sky 8 python numba

我正在尝试使用 Numba 加速我的代码。我传递给函数的参数之一是可变列表列表。当我尝试更改子列表之一时,出现此错误:

在 nopython 模式管道中失败(步骤:nopython 模式后端)无法反映反射容器的元素:反射列表(反射列表(int64))

我实际上并不关心将对本机列表所做的更改反映到原始 Python 列表中。我该如何告诉 Numba 不要反映这些更改?该文档对于 Numba 中的列表反射非常模糊。

谢谢,

Dee*_*ini 5

直接引用文档

在 nopython 模式下,Numba 不对 Python 对象进行操作。列表被编译成内部表示。任何列表参数都必须在进入 nopython 模式时转换为这种表示形式,并且它们包含的元素必须通过称为反射的过程恢复到原始 Python 对象中。

需要反射来维护与常规 Python 代码中相同的语义。但是,对于大型列表,反射过程可能会很昂贵,并且包含反射数据类型的列表不支持反射过程。由于此限制,用户无法使用 list-of-list 作为参数。

你最好的选择是给出一个 shape 的 2D numpy 数组len(ll) x max(len(x) for x in ll), ll 是列表的列表。我自己使用类似的方法来实现这一点,然后将其传递arr, lengths给 njit 编译的函数:

def make_2D_array(lis):
    """Funciton to get 2D array from a list of lists
    """
    n = len(lis)
    lengths = np.array([len(x) for x in lis])
    max_len = np.max(lengths)
    arr = np.zeros((n, max_len))

    for i in range(n):
        arr[i, :lengths[i]] = lis[i]
    return arr, lengths
Run Code Online (Sandbox Code Playgroud)

HTH。