2014-11-14 2 views
2

numba를 사용하여 np.take의 속도를 높일 수 있습니까?numba로 속도가 빨라 졌습니까?

여기 내 시도이지만, 훨씬 느립니다. nopthon 모드는 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

"numba를 사용하여 np.take의 속도를 높일 수 있습니까?" 나는 네가 할 수 있을지 의심 스럽다. – YXD

답변

2

는 대답은 no입니다.

Numba는 np.take()과 같은 컴파일 된 함수 나 알고리즘의 기초가되는 공상 색인 생성과 함께 작동하는 배열 메서드에서 작동하지 않습니다. Numba는 해석 된 코드 부분에서 작동합니다.

귀하의 take() 함수는 아마도 NumPy보다 더 많은 오버 헤드를 가지며 Numba는 for 루프 (해석 된)를 개선했습니다.

NumPy가 1.9보다 크면 알고리즘은 멋진 색인 생성을 기반으로하고 they improved the fancy indexing efficiencynp.take() 수준이므로 NumPy의 테이크에 가까워 야합니다.

관련 문제