¿Cuándo se comstack una función numba?

Estoy trabajando en este ejemplo:

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

y afirma que:

Debes asegurarte de que inner_func esté comstackdo en este punto, porque la comstackción debe ocurrir en el hilo principal. Este es el caso en este ejemplo porque usamos jit ().

Parece en el ejemplo que llamar a jit en una función asegura la comstackción en ese momento.

¿Funcionaría el ejemplo de multiproceso si, en lugar de llamar a jit en la función, hubiéramos usado jit con los tipos de argumentos especificados como decorador? Creo que esto es equivalente a preguntar si la función se comstackría en la definición si se combinara con un decorador.

 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]) restrethread(threadstate) signature = nb.void(nb.double[:], nb.double[:], nb.double[:]) inner_func_nb = nb.jit(signature, nopython=True)(inner_func) 

vs

 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]) restrethread(threadstate) 

A menos que me esté perdiendo algo, sus dos ejemplos son exactamente equivalentes, no por cualquier cosa que numba haga (o no haga), sino porque así es como funcionan los decoradores. Explicaré el principio general y puede verificar si esa es la transformación que está preguntando. Este código:

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

es por definición equivalente a:

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

el cual, si hacemos las suposiciones razonables de que d(arg) no tiene efectos secundarios, puede reescribirse como:

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

El decorador ni siquiera puede notar la diferencia (sin utilizar deliberadamente magia negra frágil).

La única diferencia es que, en el primer ejemplo, llamó a la función decorada inner_func_nb lugar de reemplazar inner_func con ella. Esto provocaría un comportamiento diferente si llamara inner_func , ya que en el primer ejemplo estaría llamando a la función un-jit sin decorar. Eso no significa que el jitting no ocurra, solo que su resultado se almacena con un nombre diferente.