Cython中“@cython.boundscheck\@cython.wraparound(False)”有什么用?

Cython代码中通常会出现@cython.boundscheck(False)这样的语句.

@cython.boundscheck(False)  # Deactivate bounds checking
@cython.wraparound(False)   # Deactivate negative indexing.

Boundscheck 是一种安全检查,您正在访问向量边界内的索引。如果您不费心检查索引是否可以越界,那么它会更快。执行检查需要时间。

也就是说,如果 boundcheck 为真,它将在读取或写入内存之前检查索引是否在向量的范围内。如果不是,它会抛出错误。如果 boundcheck 为 false,即使索引越界,它也会读取或写入指针,通过读取和写入内存破坏数据来给出错误数据。

数组查找仍然受到两个因素的影响:

  1. 执行边界检查。

  2. 检查并正确处理负指数。上面的代码是显式编码的,因此它不使用负索引,并且(希望)始终在边界内访问。

使用装饰器@cython.boundscheck(False),可以停用这些检查.
使用装饰器@cython.wraparound(False) ,可以关闭负数访问
官方文档中也给出了警告:
速度需要付出一些代价。特别是将类型化对象设置为 None 可能很危险。将此类对象设置为 None 是完全合法的,但您可以对它们做的就是检查它们是否为 None。所有其他用途(属性查找或索引)都可能导致段错误或损坏数据(而不是像在 Python 中那样引发异常)。
实际规则有点复杂,但主要信息很明确:不要在不知道类型化对象未设置为 None 的情况下使用它们。

有趣的是,根据stackoverflow一些问题, 某些特定情况下,出现了boundcheck 为True可能比为Fasle还快的情况.

猜你喜欢

转载自blog.csdn.net/ftimes/article/details/119889666