Cython 编译错误 "Not allowed in a constant expression"

Cython compilation error "Not allowed in a constant expression"

以下

cimport cython

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

工作正常。但是当我尝试这个时:

cimport cython

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

我收到以下错误:

[1/1] Cythonizing test.pyx

Error compiling Cython file:
------------------------------------------------------------
...
cimport cython

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

test.pyx:13:20: Not allowed in a constant expression
     

由于找到 this 相关的 stackexchange post 并阅读了 Kurt W. Smith 的 Cython 书,添加了装饰器。据我所知,这应该可以告诉 Cython 不要担心由于具有动态索引变量而可能导致的越界错误,但由于某些原因它不会。我也尝试过在编译器选项和全局范围内更改 boundscheck,但无济于事。

如果不是因为 Cython 文档声称是最新的,我会认为 boundscheck 已经贬值了。

失败与cython.boundscheck无关。

边界检查只是检查您是否尝试访问不存在的数组元素。例如,如果您有一个大小为 4 的数组并尝试访问元素 5 - 使用 boundscheck(True) 它将给您一个异常,使用 boundscheck(False) 它将导致未定义的行为(可能导致分段错误)。

编译失败还有一个原因:不能创建动态长度的静态数组!在编译时需要知道元素的数量,这只是 强制执行的(我猜)。

但是您可以定义 rcompile time:

DEF r=4

cimport cython

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

然而,您可以简单地创建一个 NumPy 数组并将其存储在 memoryview 变量中:

cimport cython
import numpy as np

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