在阅读关于类的 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__
中的部分和代码,我们可以让它们运行得更慢。部分?
最佳答案
cpdef
不影响函数内部代码的速度。它只创建了一个可以直接从 C/Cython 调用的函数版本(无需通过 Python 调用机制)。函数的“内部”在两种情况下都被编译并以完全相同的速度运行。见 Definition of def, cdef and cpdef in cython进行全面讨论。
大多数 Cython 特殊函数(名称格式为 __xxx__
的函数)仅限于定义为 def
职能。主要是因为它们对 Python 解释器有特殊用途,而 Cython 将无法使用 C 快捷版本。 __init__
也不异常(exception) - 它是正常 Python 构造机制的一部分,因此将其称为 Python 方法才有意义。__cinit__
这是一个有点奇怪的情况 - 它只能由 Cython(隐式)调用,不能由用户调用。因此,它实际上也不是正常的 def
, cdef
或 cpdef
方法。因此,使用什么关键字来定义它只是语言设计的问题(无论您选择什么,它总是以相同的方式调用)。就它接受的参数而言,它的行为类似于 def
功能,因为它可以处理 *args
和 **kwds
但只有可以直接从 Python 对象转换的类型(即不是 C 指针)。
如果你可以做一个替代cdef
(或 cpdef
)staticmethod
构造函数可以直接从 Cython 调用。 This is discussed in the documentation .
关于cython - 为什么cpdef不与cython中的__init__一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31639717/