繁体   English   中英

cython 中的模块 function 得到额外检查 static 方法没有

[英]Module function in cython gets extra check that a static method doesn't

我有以下 class static 方法和方法用户:

@cython.cclass
class TestClass:

    @staticmethod
    @cython.cfunc
    def func(v: float) -> float:
        return v + 1.0

    def test_call(self):
        res = TestClass.func(2)
        return res

res = TestClass.func(2)行在带注释的版本中显示为白色(正如预期的那样)并被翻译为 C

__pyx_t_1 = __pyx_f_8crujisim_11cythontests_9TestClass_func(2.0); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 521, __pyx_L1_error)__pyx_v_res = __pyx_t_1;

但是,如果我现在从 class 中取出 static 方法并将其转换为 function,如

@cython.cfunc
def func(v: float) -> float:
    return v + 1.0

@cython.cclass
class TestClass:

    def test_call(self):
        res = func(2)
        return res

然后res = func(2)行现在是黄色的,C 翻译显示额外的测试

__pyx_t_1 = __pyx_f_8crujisim_11cythontests_func(2.0); if (unlikely(__pyx_t_1 == ((double)-1) && PyErr_Occurred())) __PYX_ERR(0, 521, __pyx_L1_error)__pyx_v_res = __pyx_t_1;

由于我报告的这种行为,我被迫从 class 中获取方法,我认为这是一个错误https://github.com/cython/cython/issues/5159 但是方法调用在关键路径的紧密循环内,并且存在明显的性能损失。

这可能是参数溢出检查吗? 可以禁用吗? 有什么提示吗? 谢谢。

您可以使用@cython.exceptval(check=False) (或非纯 Python 语法中的cdef float func() noexcept )使cdef / cfunc function 无法引发异常。 有关异常的完整详细信息,请参阅文档 如果你这样做,它不会被检查。

Cython 3 已将默认行为从“ cdef函数吞噬异常”更改为“ cdef函数可以引发异常”,但可以选择其中任何一个。


您在staticmethod和模块级 function 之间看到的差异可能是一个小错误 - 没有理由让它们表现不同。

但是,我实际上希望额外的检查是在非错误情况下的优化: PyErr_Occurred()预计会很昂贵,因此使用-1作为标志值来指示可能发生错误可以避免大部分情况时间。 不过,我还没有在您的确切情况下对其进行测量-这可能是跳过昂贵的检查与更大的代码大小之间的平衡。

带注释的 HTML 突出显示非常粗糙,因此几乎是在“更多文本 == 更慢”的基础上工作,这在这里并不完全正确。 所以不要认真。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM