是否有可能使用numba加速np.take?
这是我的尝试,但速度要慢得多。我不能使用nopython模式,因为它不喜欢np.empty_like命令。
import numba
import numpy as np
from timer import Timer
def take( x, indices ):
result = np.empty_like( indices, dtype=x.dtype )
for i in range( len( indices ) ):
result[i] = x[ indices[ i ] ]
return result
jtake = numba.jit("f4[:](f4[:],i4[:])" )( take )
if __name__=='__main__':
N = 100000
m = 100
idx = np.random.random_integers( 0, N, m )
x = np.random.randn( N )
num_tests=10000
with Timer( 'take' ):
for i in range( num_tests ):
r0 = take( x, idx )
with Timer( 'Numba take' ):
for i in range( num_tests ):
r1 = jtake( x, idx )
with Timer( 'Numpy.take' ):
for i in range( num_tests ):
r2 = x.take( idx )
结果如下:
Beginning take
take took 2.46 seconds
Beginning Numba take
Numba take took 1.11 seconds
Beginning Numpy.take
Numpy.take took 0.04 seconds
答案 0 :(得分:2)
答案是否定的。
Numba不会对np.take()
等编译函数或使用花式索引的数组方法起作用,这是您算法的基础。 Numba对代码的解释部分起作用。
你的take()
函数可能比NumPy有更多的开销,Numba改进了for循环(解释)。
使用NumPy> 1.9你的代码应该接近NumPy,因为你的算法是基于花哨的索引而they improved the fancy indexing efficiency是基于np.take()
的水平。