2014-12-16 2 views
4

나는이 예를 해제하고 있어요 :numba 함수는 언제 컴파일됩니까?

http://numba.pydata.org/numba-doc/0.15.1/examples.html#multi-threading

를 그리고 있음 상태 : 컴파일이 주 스레드에서 발생해야하기 때문에 당신은 확실히 inner_func이 시점에서 컴파일해야

. 이 예제에서는 jit()을 사용하기 때문에이 경우이다.

함수에서 jit를 호출하면 해당 시점에 컴파일이 수행됩니다.

jit을 데코레이터로 지정된 인수 유형으로 사용했던 함수에서 jit을 호출하는 대신 멀티 스레드 예제가 작동합니까? 제 생각에 이것은 데코레이터를 사용하여 함수를 정의 할 때 함수를 컴파일할지 묻는 것과 같습니다.

import numba as nb 
import numpy as np 
def inner_func(result, a, b): 
    threadstate = savethread() 
    for i in range(len(result)): 
     result[i] = np.exp(2.1 * a[i] + 3.2 * b[i]) 
    restorethread(threadstate) 
signature = nb.void(nb.double[:], nb.double[:], nb.double[:]) 
inner_func_nb = nb.jit(signature, nopython=True)(inner_func) 

import numba as nb 
import numpy as np 
signature = nb.void(nb.double[:], nb.double[:], nb.double[:]) 
@nb.jit(signature, nopython=True) 
def inner_func(result, a, b): 
    threadstate = savethread() 
    for i in range(len(result)): 
     result[i] = np.exp(2.1 * a[i] + 3.2 * b[i]) 
    restorethread(threadstate) 

답변

4

내가 뭔가를 누락하지 않는 한 대, 당신의 두 예제는 아무것도 numba가하는 (혹은하지 않는) 때문이 아니라의 정확히 동일하지만, 그 장식이 작동하는 방법이기 때문에. 나는 일반적인 원리를 설명 할 것이고 그것이 당신이 요구하는 변형인지 여부를 다시 확인할 수 있습니다. 이 코드 :

@d(arg) 
def f(x): ... 

는에 정의에 해당하는 것입니다 :

def f(x): ... 
f = d(arg)(f) 

: 우리가 d(arg)는 부작용이 없다는 합리적인 가정을하면, 같이 다시 할 수

_decorator = d(arg) 
def f(x): ... 
f = _decorator(f) 

데코레이터는 그 차이를 (고의적으로 깨지기 쉬운 검은 마법을 사용하지 않고) 말할 수조차 없습니다.

유일한 차이점은 첫 번째 예에서는 inner_func 대신 데코 레이팅 된 함수 inner_func_nb을 호출 한 것입니다. inner_func을 호출하면 다른 동작이 발생합니다. 첫 번째 예제에서는 un-decorated un-jitted 함수를 호출 할 것이기 때문입니다. 그렇다고해서 결과가 다른 이름으로 저장된다는 것만은 아닙니다.

+0

아주 좋은 설명입니다. – evan54

관련 문제