在阅读了关于类的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
而不是cdef
或cpdef
?
我意识到有一个__cinit__
功能,但是不应该让cpdef __init__
更快地使__init__
代码变为现实吗?
或者,我们是否应该在__cinit__
部分中放置我们需要非常快速生成的代码,以及我们可以在__init__
部分中运行得更慢的代码?
答案 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调用(隐式),而不能由用户调用。因此,它实际上不是普通的def
,cdef
或cpdef
方法。因此,使用什么关键字来定义它只是语言设计的问题(无论您选择什么,总会以相同的方式调用它)。就其接受的参数而言,它的行为类似于def
函数,因为它可以处理*args
和**kwds
,但只能处理可直接从Python对象转换的类型(即,不是C指针)
如果您可以使备用cdef
(或cpdef
)staticmethod
构造函数直接从Cython中调用,则可以。 This is discussed in the documentation。