我正在尝试使用 Numba 加速我的代码。我传递给函数的参数之一是可变列表列表。当我尝试更改子列表之一时,出现此错误:
在 nopython 模式管道中失败(步骤:nopython 模式后端)
无法反映反射容器的元素:反射列表(反射列表(int64))
我实际上并不关心将对本机列表所做的更改反映到原始 Python 列表中。我该如何告诉 Numba 不要反映这些更改?该文档对于 Numba 中的列表反射非常模糊。
Thanks,
直接引用自the docs https://numba.pydata.org/numba-doc/dev/reference/pysupported.html#list-reflection:
在 nopython 模式下,Numba 不对 Python 对象进行操作。列出的是
编译成内部表示。任何列表参数都必须是
在进入 nopython 模式时转换成这种表示形式并且
它们包含的元素必须在原始Python中恢复
对象通过称为反射的过程。
需要反射来维护与中找到的相同的语义
常规 Python 代码。然而,反射过程可能会很昂贵
对于大型列表,并且不支持包含以下内容的列表
反映的数据类型。用户不能使用 list-of-list 作为参数
由于这个限制。
你最好的选择是给出一个 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
HTH.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)