我正在尝试使用 Numba 加速我的代码。我传递给函数的参数之一是可变列表列表。当我尝试更改子列表之一时,出现此错误:
在 nopython 模式管道中失败(步骤:nopython 模式后端)无法反映反射容器的元素:反射列表(反射列表(int64))
我实际上并不关心将对本机列表所做的更改反映到原始 Python 列表中。我该如何告诉 Numba 不要反映这些更改?该文档对于 Numba 中的列表反射非常模糊。
谢谢,
直接引用文档:
在 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。
| 归档时间: |
|
| 查看次数: |
10679 次 |
| 最近记录: |