在 cdef 类中使用 @cython.final 的性能优势?

问题描述 投票:0回答:1

我目前正在阅读有关

@cython.final
装饰器的内容,我想知道它是否在运行时添加任何 性能优势,或者仅防止某些操作引发错误,如中所述 https://cython.readthedocs.io/en/latest/src/userguide/extension_types.html

谢谢,

cython
1个回答
0
投票

我想知道它是否会在运行时增加任何性能优势

是的。

主要优点是在调用

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__

方法调用的优化是主要的(并且相当普遍,适用于大多数具有“最终”类型概念的语言)。

© www.soinside.com 2019 - 2024. All rights reserved.