我目前正在阅读有关
@cython.final
装饰器的内容,我想知道它是否在运行时添加任何 性能优势,或者仅防止某些操作引发错误,如中所述
https://cython.readthedocs.io/en/latest/src/userguide/extension_types.html
谢谢,
我想知道它是否会在运行时增加任何性能优势
是的。
主要优点是在调用
cdef/cpdef
函数时。考虑:
cdef class C:
cdef f(self):
...
def some_func(C c):
c.f()
如果没有
final
,这将调用 C.f
或任何派生类中的重写函数。这个调用看起来像:
((struct __pyx_vtabstruct_3fnl_C *)__pyx_v_c->__pyx_vtab)->f(__pyx_v_c);
(即它通过“vtable”和两个指针取消引用来计算出实际调用的函数。)
使用
final
通话看起来像
__pyx_f_3fnl_1C_f(__pyx_v_c)
(即它在编译时知道确切的函数并且不经历指针取消引用)。
使用
cpdef
,差异更加显着,因为 cpdef
函数可能会被 Python 中实现的派生类覆盖,因此检查也涉及 dict
查找。
还有其他一些优化:
__dict__
。方法调用的优化是主要的(并且相当普遍,适用于大多数具有“最终”类型概念的语言)。