The following
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
由于发现这篇相关的stackexchange帖子和读 Kurt W. Smith 的Cython书籍,所以添加了装饰器。据我所知,这应该可以告诉Cython不必担心由于具有动态索引变量而可能导致的越界错误,但出于某种原因它并没有起作用。我还尝试过更改编译器选项和全局范围内的boundscheck,但都无济于事。
如果不是Cython文档声称已经更新到最新版,我会认为boundscheck已经被弃用了。
cdef double l[r]
创建动态长度数组,而只能使用已知常量,例如cdef double l[4]
。 - MSeifert