numba jitted函数中集合的正确签名是什么?

问题描述 投票:2回答:1

如果我理解正确,我可以通过添加签名来提高numba函数的性能。例:

@njit(int32(int32, int32))
def f(x, y):
    # A somewhat trivial example
    return x + y

现在我有两套功能。什么是正确的签名?

@njit(int32(set(int32), set(int32)))
def f(set_1, set_2):
    # A somewhat trivial example
    return x

我认为签名(int32(set(int32), set(int32)))可能是正确的,但没有任何事情发生。 print(numba.typeof(set_1))返回reflected set(int32)

python set jit signature numba
1个回答
2
投票

如果我理解正确,我可以通过添加签名来提高numba函数的性能。

那是错的 - 或者只是部分正确。使用签名numba只是提前编译函数,而不是第一次使用这些参数调用时。第一次通话后,两者应该同样快。在某些情况下,如果没有签名,函数可能会稍快一些(特别是对于numba可以使用输入的数组对齐的数组)。

现在我有两套功能。什么是正确的签名?

包含整数的Python集的正确签名是:

numba.types.Set(numba.int64, reflected=True)

因此,采用两组(并返回一组)的函数的签名将是:

import numba as nb

reflected_int_set = nb.types.Set(nb.int64, reflected=True)

@nb.njit(reflected_int_set(reflected_int_set, reflected_int_set))
def f(set_1, set_2):
    return set_1

>>> f({1,2,3}, {3,4,5})
{1, 2, 3}

但由于它(很可能)不能提高性能,我根本不会打扰签名。

另外需要注意的是:numba会将Python集转换为内部的numba集,因此将Python set传递给numba函数或将set从numba函数返回到Python上下文将复制整个集。在大多数情况下,开销比numba提供的潜在加速要重要得多。

根据我的经验,sets和lists与numba只有在严格限制于numba功能时才有意义。因此,如果您将它们用作参数或返回它们(对于非numba函数/上下文),您必须测量性能并检查您是否真的获得了加速。

© www.soinside.com 2019 - 2024. All rights reserved.