【问题标题】:guvectorize Not resolving types in nopython modeguvectorize 在 nopython 模式下不解析类型
【发布时间】:2021-11-08 06:07:19
【问题描述】:

我正在为一个 numba 错误而苦苦挣扎 Untyped global name 'is_a_subset': Cannot determine Numba type of <class 'numba.np.ufunc.gufunc.GUFunc'> 这通常意味着我摸索并使用了 numba 不支持的方法。以下代码失败。

@guvectorize("(n),(n)->(n)",nopython=True)
def is_a_subset(x,y,out):
    out[:]=np.array([item in x for item in y])

@njit()
def test(x,y,z):
    is_a_subset(x,y,z)
    return z.mean()

x=np.array([[1,2,3],[3,2,1]])
y=np.array([[3,6,1],[1,2,3]])
z = np.empty_like(x)
test(x,y,z)

但是,在测试功能上删除 njit 会使一切正常。

def test(x,y,z):
    is_a_subset(x,y,z)
    return z.mean()

为什么 numba 在非 Python 模式下难以解析类型?
我也试过没有不同的结果

@guvectorize(["f8[:],f8[:],f8[:]"],"(n),(n)->(n)",nopython=True)
def is_a_subset(x,y,out):
    out[:]=np.array([item in x for item in y])

【问题讨论】:

    标签: python vectorization jit numba


    【解决方案1】:

    我正在使用 Numba 0.53.1 并且可以复制此错误。这个 blog 在 Numba 0.53 中对 guvectorize 的动态调度更新在最后提到了这一点(强调添加):

    在未来,我们希望使@guvectorize 的功能更接近@vectorize 的功能。例如,目前无法从 jited (@jit) 函数中调用 guvectorize 函数。

    有一个类似的open issuevectorize,但它表明@vectorize 函数可以在@jit 函数中调用,只是它被限制为默认的target = "cpu"

    【讨论】:

    • 知道如何向量化这个函数吗?
    • 在 Numba 开发人员解决这些问题之前(可能需要一段时间),我只会设计在 1 个普通 Python 中调用的小型 @njit@vectorize@guvectorize 函数就像胶水一样的功能,就像你未装饰的test。当你把所有的循环和向量化到 NumPy 或 Numba 中时,胶水函数中几乎没有什么可以优化的了。
    猜你喜欢
    • 1970-01-01
    • 2021-08-21
    • 2020-07-21
    • 2020-07-15
    • 2019-07-30
    • 2016-10-04
    • 2014-12-18
    • 1970-01-01
    • 2017-08-08
    相关资源
    最近更新 更多