为什么 numba 没有加速以下代码?

Why is numba not speeding up the following piece of code?

为什么 numba 没有加速以下代码?

@jit(nopython=True)
def sort(x):
    for i in range(1000):
        np.sort(x)

我认为 numba 是为这些类型的任务而设计的,在这些任务中,for 循环与 numpy 操作相结合。然而这个 jitted 函数比纯 Python 变体(即相同的函数但没有 jit)慢 2-3 倍,是的,我在编译后有 运行 它。

我是不是做错了什么?

编辑:

x 的大小和数据类型是 dtype = int32 AND float64(我都试过了),len = 5000。

我也不希望有任何性能优势。 Numba 并不是一根魔杖,如果你只是添加它,你就会神奇地获得更好的性能。它确实有一个很容易偷偷摸摸的开销。它有助于理解 numba 到底做了什么。它解析 python 函数的 ast 并使用 llvm 将其编译为本机代码,对于许多非平凡的情况,这会产生巨大的差异,因为老实说,python 在复杂的数学和分支方面很糟糕。对于其设计选择而言,这是一个合理的缺点。看看你的代码。它是 for 循环中的一个 numpy 排序函数。从逻辑上思考 numba 可能做出哪些优化可以加快速度。请记住,numpy 已经非常快了,numba 不会真正影响性能。因此,您实际上已经为代码的最关键部分增加了开销,从而降低了性能。

Numba 实现的性能并不意味着相对较大的数组(例如 > 1024)会更快。事实上,Numba 和 Numpy 都像 Numba 一样使用编译排序算法(除了 Numba 使用 JIT)。 Numba 在这里只对 小数组 更好,因为它可以大部分消除从 CPython 解释器调用 Numpy 函数的开销(并执行许多输入检查)。 运行宁时间主要由排序调用的时间决定,而不是大小为 5000 的数组的循环开销(见下文)。

除此之外,这两种实现似乎都使用了轻微的不同的算法实现(至少不同的阈值)。因此,这两种实现会产生不同的性能。这取决于输入数组。某些排序算法在某些特定类型的分布上速度很快,而另一些排序算法在其他类型的分布上速度较慢,反之亦然。

这是根据在我的机器上随机数组测试的数组大小绘制的两个实现的 运行 执行时间(32 位整数从 0 到 1,000,000,000):

可以看出 Numba 对于小数组更快,对于大数组更快。当 len=5000 时,Numba 实现速度慢 50%。

请注意,您可以使用参数 kind 调整使用的算法。另请注意,一些 Numpy 优化实现使用 并行性 以便原语可以 运行 更快。在这种情况下,与 Numba 实现的比较是不公平的,因为 Numba 应该使用顺序实现(特别是如果 parallel=True 未设置)。除此之外,这个问题似乎很好known issue,开发人员正在努力解决它。