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)
它将导致未定义的行为(可能导致分段错误)。
编译失败还有一个原因:不能创建动态长度的静态数组!在编译时需要知道元素的数量,这只是 c 强制执行的(我猜)。
但是您可以定义 r
在 compile 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)
以下
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)
它将导致未定义的行为(可能导致分段错误)。
编译失败还有一个原因:不能创建动态长度的静态数组!在编译时需要知道元素的数量,这只是 c 强制执行的(我猜)。
但是您可以定义 r
在 compile 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)