Numpy numba:对数组进行适当排序

Numpy numba:对数组进行适当排序,numpy,jit,numba,Numpy,Jit,Numba,Numba具有通过JIT编译加速循环的惊人能力。然而,关键在于,当使用numpy时。幸运的是,大多数numpy函数都包含一个可选的out参数,用于将输出写入--numpy.sort除外。最明显的选择是numpy.ndarray.sort,它已经就位 @njit(“void(f8[:])) def分拣_就地(arr): arr.sort() 但是这个没有编译, 。。。 ... ... /传播(self)中的Users/duckworthd/anaconda/lib/python2.7/site-

Numba具有通过JIT编译加速循环的惊人能力。然而,关键在于,当使用numpy时。幸运的是,大多数numpy函数都包含一个可选的
out
参数,用于将输出写入--
numpy.sort
除外。最明显的选择是
numpy.ndarray.sort
,它已经就位

@njit(“void(f8[:]))
def分拣_就地(arr):
arr.sort()
但是这个没有编译,

。。。
...
...
/传播(self)中的Users/duckworthd/anaconda/lib/python2.7/site-packages/numba/typeinfer.pyc
293打印(“传播”。中心(80'-))
294 oldtoken=newtoken
-->295 self.constraints.propagate(self.context,self.typevars)
296 newtoken=self.get\u state\u token()
297如果config.DEBUG:
/传播中的Users/duckworthd/anaconda/lib/python2.7/site-packages/numba/typeinfer.pyc(self、context、typevars)
112提高
113例外情况除外,如e:
-->114 raise TYPENGERROR(“内部错误:\n%s”%e,CONSTRAINT.loc)
115
116
打字机错误:内部错误:
数组(float64,1d,A)的属性“sort”未键入

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

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

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


总而言之:在numba正确支持在nopython模式下调用ndarray.sort()之前,您可以使用jit装饰器而不是njit装饰器,只要您不在循环中对数组进行排序。

看起来像
arr.sort
是C代码,而不是Python循环。排序(a)只需复制一份
a
,并对其进行排序。那么有什么可以加速呢?为了有效地将向量投影到1-范数球上,对向量进行排序是一个必要的子例程。看,我不是在质疑你需要什么。相反,我想知道这是否是麻木可以加速的事情。如果它已经被编译过,那么它的速度已经达到了极限。您可以使用
kind
参数的不同值。谢谢@jayvius!我想要调用的
np.sort
嵌套在一个“nopython”模式循环中,所以我继续实现了冒泡排序,只是为了让事情顺利进行。如果我使用“python”模式,相对于纯python基线,性能实际上更差,但是使用“nopython”模式,我的速度提高了200倍!见相关代码: