Cython “No se permite en una expresión constante”, el control de límites Falso no funciona

Soy relativamente nuevo en Cython y he encontrado un error en el que mi investigación me ha fallado (estoy usando Python3 en spyder y mi versión de Sython es 0.26)

Intenté esto:

import cython @cython.boundscheck(False) def boundtest(): cdef int r=4 cdef double l[3] 

y funciona bien. Pero entonces intenté esto:

 import cython @cython.boundscheck(False) def boundtest(): cdef int r=4 cdef double l[r] 

y recibo el error

 [1/1] Cythonizing test.pyx Error compiling Cython file: ------------------------------------------------------------ ... import cython @cython.boundscheck(False) def boundtest(): cdef int r=4 cdef double l[r] ^ ------------------------------------------------------------ test.pyx:13:20: Not allowed in a constant expression 

El decorador se agregó debido a que encontró este post de intercambio de stack relacionado y leía el libro Cython de Kurt W. Smith. Por lo que puedo decir, esto debería funcionar para decirle a Cython que no se preocupe por los errores fuera de los límites que pueden resultar de tener una variable de indexación dinámica, pero por alguna razón no es así. También he intentado cambiar los límites de verificación en las opciones del comstackdor y de forma global sin éxito.

Si no fuera por la documentación de Cython que dice estar actualizada, me parece que se ha depreciado.

ACTUALIZAR

Me di cuenta de que he usado import Cython lugar de cimport cython . Probé de nuevo con

 cimport cython 

Pero consigue el mismo error.

ACTUALIZACIÓN 2

En una nota similar el código

 cdef int N = 3 cdef double[:] lout = array.array('d', N) 

arroja el error

 TypeError: 'int' object is not iterable 

Supongo que por la misma razón que C no puede lidiar con (posiblemente) la asignación de arreglos dynamics. En su lugar debemos usar

 cdef double[:] lout = numpy.empty(N, 'd') 

y asumo que hay una línea que convierte N en un tipo estático en algún lugar antes de colocarlo en la matriz C

El fallo no tiene nada que ver con cython.boundscheck .

La comprobación de límites es solo comprobar si intenta acceder a un elemento de una matriz que no está allí. Por ejemplo, si tiene una matriz de tamaño 4 y trata de acceder al elemento 5, con boundscheck(True) le dará una Excepción, con boundscheck(False) resultará en un comportamiento indefinido (probablemente causando un fallo de segmentación).

El motivo del error de comstackción es otro: ¡No puede crear una matriz estática con una longitud dinámica! La cantidad de elementos que se deben conocer en el momento de la comstackción, eso es algo que c impone (supongo).

Sin embargo, podría definir r para ser conocido en tiempo de comstackción :

 DEF r=4 cimport cython @cython.boundscheck(False) def boundtest(): cdef double l[r] 

Sin embargo, podría simplemente crear una matriz NumPy y almacenarla en una variable de vista de memoria:

 cimport cython import numpy as np @cython.boundscheck(False) def boundtest(): cdef int r=4 cdef double[:] l = np.empty(r, dtype=np.double)