【发布时间】: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参数的不同值。