Numba具有使用JIT编译加速循环的惊人能力。然而,当使用numpy时,不允许创建任何新数组。幸运的是,大多数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
,并对其进行排序。那么有什么可以加速的地方呢? - hpaulj