为什么cpdef在cython中不与__init__一起使用

时间:2015-07-26 17:12:24

标签: cython

在阅读了关于类的Cython文档之后有一个基本问题,但我想明白这一点。以下是Cython documentation的示例代码:

cdef class Rectangle:
    cdef int x0, y0
    cdef int x1, y1
    def __init__(self, int x0, int y0, int x1, int y1):
        self.x0 = x0; self.y0 = y0; self.x1 = x1; self.y1 = y1
    cpdef int area(self):
        cdef int area
        area = (self.x1 - self.x0) * (self.y1 - self.y0)
        if area < 0:
            area = -area
        return area

为什么__init__前面有def而不是cdefcpdef

我意识到有一个__cinit__功能,但是不应该让cpdef __init__更快地使__init__代码变为现实吗?

或者,我们是否应该在__cinit__部分中放置我们需要非常快速生成的代码,以及我们可以在__init__部分中运行得更慢的代码?

1 个答案:

答案 0 :(得分:0)

cpdef不会影响函数内部代码的速度。它仅创建可以直接从C / Cython调用的函数版本(而无需通过Python调用机制)。在这两种情况下,函数的“内部”都将被编译,并且以完全相同的速度运行。有关完整的讨论,请参见Definition of def, cdef and cpdef in cython

大多数Cython特殊功能(名称形式为__xxx__的那些)仅限于定义为def功能。本质上是因为它们为Python解释器提供了特殊的用途,而Cython将无法使用C快捷方式版本。 __init__也不例外-它是普通Python构造机制的一部分,因此仅将其称为Python方法才有意义。

__cinit__是一个有点奇怪的情况-它只能由Cython调用(隐式),而不能由用户调用。因此,它实际上不是普通的defcdefcpdef方法。因此,使用什么关键字来定义它只是语言设计的问题(无论您选择什么,总会以相同的方式调用它)。就其接受的参数而言,它的行为类似于def函数,因为它可以处理*args**kwds,但只能处理可直接从Python对象转换的类型(即,不是C指针)


如果您可以使备用cdef(或cpdefstaticmethod构造函数直接从Cython中调用,则可以。 This is discussed in the documentation