Los tipos de búfer solo se permiten como variables locales de función, pero eso es lo que estoy haciendo

¿A Cython no le gustan las matrices de números en los cierres?

%%cython import numpy as np cimport numpy as np def f(np.ndarray[double, ndim=1] a): def g (double b): return a+b return g(1) 

Usando la versión estable 0.24, obtengo:

 Error compiling Cython file: ------------------------------------------------------------ ... import numpy as np cimport numpy as np def f(np.ndarray[double, ndim=1] a): ^ ------------------------------------------------------------ cython_magic.pyx:4:6: Buffer types only allowed as function local variables 

Si me deshago de la definición de g , comstack / funciona bien.

Hay algunas rondas de trabajo:

  1. Solo asigne el tipo a la variable dentro de la función interna:

     def f(a): def g (double b): cdef np.ndarray[double, ndim=1] a_typed = a return a_typed+b return g(1) 

    Esto tiene un pequeño costo asociado con la verificación del tipo en cada llamada de g , cuya importancia depende de la cantidad de trabajo que esté realizando en g .

  2. Use una mezcla de vistas de memoria y variables sin tipo.

     def f(a): cdef double[:] memview_of_a = a def g(double b): memview_of_a[0] = 0 # example of indexing operation return a+b return g(1) 

    Lo que hay que recordar aquí es que memview_of_a y a vistazo a los mismos datos, para que pueda acceder a ellos de dos maneras diferentes. La indexación de matrices es rápida con la vista de memoria. Cosas como las operaciones escalares en arreglos no son realmente afectadas por la información de tipo, por lo que realmente no hay razón para forzar que sea un tipo específico.

En resumen, es una limitación, pero hay lugares de trabajo (aunque no son muy ordenados).