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数组。
答案 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;结束了。)