2016-06-11 2 views
6

일부 코드를 최적화하기 위해 numba를 시도하고 있습니다. 나는 0.26.0 사용자 가이드 (http://numba.pydata.org/numba-doc/0.26.0/user/jit.html)의 1.3.1 절의 초기 예제를 통해 작업 한 결과 예상되는 결과를 얻었으므로 문제가 설치되지 않는다고 생각합니다.python numba 지문 오류

여기 내 코드입니다 :

import numba 
import numpy 
import random 

a = 8 
b = 4 

def my_function(a, b): 
    all_values = numpy.fromiter(range(a), dtype = int) 
    my_array = [] 
    for n in (range(a)): 
     some_values = (all_values[all_values != n]).tolist() 
     c = random.sample(some_values, b) 
     my_array.append(sorted([n] + c)) 
    return my_array 

print(my_function(a, b)) 

my_function_numba = numba.jit()(my_function) 

print(my_function_numba(a, b)) 

어느 my_function 호출에서 예상되는 결과를 인쇄 한 후 다음과 같은 오류 메시지가 반환 빈 목록의

ValueError        Traceback (most recent call last) 
<ipython-input-8-b5d8983a58f6> in <module>() 
    19 my_function_numba = numba.jit()(my_function) 
    20 
---> 21 print(my_function_numba(a, b)) 

ValueError: cannot compute fingerprint of empty list 

지문을?

답변

3

특히이 오류에 대해서는 확실하지 않지만 일반적으로 빠른 numba에는 numpy/python의 특정 하위 집합이 필요합니다 (자세한 내용은 herehere 참조). 그래서 저는 이것을 이렇게 다시 쓸지도 모릅니다.

@numba.jit(nopython=True) 
def fast_my_function(a, b): 
    all_values = np.arange(a) 
    my_array = np.empty((a, b + 1), dtype=np.int32) 
    for n in range(a): 
     some = all_values[all_values != n] 
     c = np.empty(b + 1, dtype=np.int32) 
     c[1:] = np.random.choice(some, b) 
     c[0] = n 
     c.sort() 
     my_array[n, :] = c 
    return my_array 

홈페이지 가지 참고 사항 :

  1. 없는 목록, 내가 미리 할당하는 모든입니다.
  2. 발전기의 아무 소용 데코레이터 내가 효율적으로 JITed 할 수없는 무언가를 사용하는 경우 너무 numba 불평 할 수 있습니다에
  3. nopython=True를 추가 (모두 파이썬 2 에서 빠른 네이티브 루프 변환 얻을 것이다).
+0

우수하고 많은 감사합니다. 그리고 나는 91.3 마이크로 초에서 12 마이크로 초로갔습니다. c = np.empty (b + 1, dtype = np.int32)가 아닌 c = np.empty (a, dtype = np.int32) 인 이유는 무엇입니까? – zazizoma

+0

위의 코드에서'c'는 길이가'b'이고, 추가하기 전에'[n]'을 덧붙이 기 때문에 올바른 모양이라고 생각합니까? – chrisb

+0

예. 다시 한 번 감사드립니다! – zazizoma