cython何时以及如何进行边界检查?

时间:2015-03-25 18:33:49

标签: cython

c不进行边界检查。那么如果cython编译为c,cython如何进行检查?

%%cython --annotate
cimport cython
@cython.boundscheck(True)
cpdef myf():
    cdef double pd[8]
    for i in range(100):
        pd[i] = 0
        print pd[i]

无论我为True设置False还是boundscheck,上述代码都会编译为相同的C代码。如果我运行myf()则没有警告(它碰巧没有崩溃......)。

更新

因此,无论如何,cython doens都会检查c数组。

1 个答案:

答案 0 :(得分:3)

http://docs.cython.org/src/reference/compilation.html#compiler-directives

" Cython可以自由地假设代码中的索引操作([] -operator)不会导致引发任何IndexErrors。列表,元组和字符串受到影响......"

我认为在你的代码中,C double数组不会将其长度存储在任何地方,因此Cython无法进行任何有用的检查(除非在你非常简单的例子中)。但是,可以引发IndexError的内置Python类型应该是不同的(我假设numpy数组,python数组和cython内存视图也应该受到影响,因为它们都有一个Cython机制来判断它是否&& #39;结束了。)