Python / Numba: error de atributo desconocido con scipy.special.gammainc ()

Estoy teniendo un error al ejecutar el código utilizando el decorador @jit. Parece que no se puede localizar alguna información para la función scipy.special.gammainc ():

Failed at nopython (nopython frontend) Unknown attribute 'gammainc' for Module() $164.2 $164.3 = getattr(attr=gammainc, value=$164.2) 

Sin el decorador @jit, el código funcionará bien. ¿Quizás hay algo necesario para que los atributos del módulo scipy.special sean visibles para Numba?

Gracias de antemano por cualquier sugerencia, comentario, etc.

El problema es que gammainc no es una de las pequeñas funciones con las que Numba sabe cómo lidiar (ver http://numba.pydata.org/numba-doc/dev/reference/numpysupported.html ), de hecho Ninguna de las funciones de scipy es. Esto significa que no puede usarlo en el modo “nopython”, desafortunadamente, solo tiene que tratarlo como una llamada normal a la función python.

Si eliminas nopython=True , debería funcionar. Sin embargo, eso no es muy satisfactorio, ya que puede ser más lento. Sin ver su código es difícil saber exactamente qué sugerir. Sin embargo, en general:

  • Los bucles (que no contienen elementos como gammainc ) se acelerarán, incluso sin nopython.

  • gammainc es un “ufunc”, lo que significa que se puede aplicar fácilmente a una matriz completa a la vez, y debería ejecutarse rápidamente de todos modos.

  • puede llamar a func.inspect_types() para ver que ha sido capaz de comstackr.

Como ejemplo trivial:

 from scipy.special import gammainc import numba as nb import numpy as np @nb.jit # note - no "nopython" def f(x): for n in range(x.shape[0]): x[n] += 1 y = gammainc(x,2.5) for n in range(y.shape[0]): y[n] -= 1 return y f(np.linspace(0,20)) # forces it to be JIT'd and outputs an array 

Luego, f.inspect_types() identifica los dos bucles como “bucles levantados”, lo que significa que serán JIT y se ejecutarán rápidamente. El bit con gammainc no es JIT’d, pero se aplica a toda la matriz a la vez y también debe ser rápido.