有没有可能使用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发布于 2014-11-14 22:37:20
答案是否定的。
Numba不会作用于编译后的函数,如np.take()或使用花式索引的数组方法,而花式索引是算法的基础。Numba作用于代码的解释部分。
你的take()函数可能比NumPy函数有更多的开销,Numba改进了for循环(解释的)。
当NumPy >1.9时,你的代码应该更接近于NumPy,因为你的算法是基于奇特的索引和np.take()级别的they improved the fancy indexing efficiency。
https://stackoverflow.com/questions/26924677
复制相似问题