【问题标题】:numba: sorting an array in placenumba:就地排序数组
【发布时间】:2023-03-28 01:45:01
【问题描述】:

Numba 具有通过 JIT 编译加速循环的惊人能力。然而,关键的转折是在使用 numpy 时,one isn't allowed to create any new arrays。幸运的是,大多数 numpy 函数都包含一个可选的 out 参数,用于将输出写入 -- numpy.sort 除外。最明显的替代方案是numpy.ndarray.sort,它已经到位,

@njit("void(f8[:])")
def sort_inplace(arr):
  arr.sort()

但是编译失败,

...
...
...
/Users/duckworthd/anaconda/lib/python2.7/site-packages/numba/typeinfer.pyc in propagate(self)
    293                 print("propagate".center(80, '-'))
    294             oldtoken = newtoken
--> 295             self.constrains.propagate(self.context, self.typevars)
    296             newtoken = self.get_state_token()
    297             if config.DEBUG:

/Users/duckworthd/anaconda/lib/python2.7/site-packages/numba/typeinfer.pyc in propagate(self, context, typevars)
    112                 raise
    113             except Exception as e:
--> 114                 raise TypingError("Internal error:\n%s" % e, constrain.loc)
    115
    116

TypingError: Internal error:
Attribute 'sort' of array(float64, 1d, A) is not typed

没有重新实现排序算法,有没有办法在 JIT 编译的 numba 循环中对 numpy 数组进行排序?

【问题讨论】:

  • 看起来 arr.sort 是 C 代码,而不是 Python 循环。而np.sort(a) 只是复制a,并对其进行排序。那么有什么可以加快速度呢?
  • 对向量进行排序是一个必要的子程序,以便有效地将向量投影到 1-norm 球上。见machinelearning.org/archive/icml2008/papers/361.pdf
  • 我并没有质疑您是否需要排序。相反,我想知道这是否是 numba 可以加速的那种事情。如果它已经编译,它已经尽可能快了。您可以使用 kind 参数的不同值。

标签: numpy jit numba


【解决方案1】:

Numba 应该能够在“nopython”模式下编译它,但不幸的是我们还没有添加对 ndarray.sort() 的支持。它在“python”模式下编译,虽然速度较慢,因为它必须通过 python 对象层,但由于看起来 ndarray.sort() 是用 C 实现的,因此可能没有太大区别。我继续在 numba 的 github 问题跟踪器中添加了 bug report

另外需要注意的是,如果可能,numba 将在 nopython 模式下编译循环,而函数的其余部分在 python 模式下编译。这允许您使用不受支持的函数,如 ndarray.sort(),以及创建和返回新数组的函数,如 numpy.arange(),同时仍然具有快速编译循环(只要您不调用 ndarray.sort()或循环中的 numpy.arange() ,但如果性能是一个大问题,你可能不想这样做)。

总结一下:只要你不在 a循环。

【讨论】:

  • 谢谢@jayvius!我对np.sort 的期望调用嵌套在“nopython”模式循环的深处,所以我继续实施冒泡排序只是为了让事情顺利进行。如果我使用“python”模式,性能实际上比纯 Python 基线更差,但使用“nopython”模式,我获得了 200 倍的速度增益!见相关代码:github.com/duckworthd/cvxcluster/blob/numba/cvxcluster/…
猜你喜欢
  • 2010-10-02
  • 2011-07-06
  • 2013-05-11
  • 2011-05-11
  • 1970-01-01
  • 2015-02-18
  • 2020-09-11
  • 1970-01-01
相关资源
最近更新 更多