[英]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.