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

本文介绍如何在Cython中使用@cython.boundscheck(False)和@cython.wraparound(False)装饰器来提高性能,解释了边界检查的作用,以及在特定情况下关闭检查的潜在风险。
摘要由CSDN通过智能技术生成

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还快的情况.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值