gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:42:26 27 4
gpt4 key购买 nike

在阅读关于类的 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__ 中的部分和代码,我们可以让它们运行得更慢。部分?

最佳答案

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 , cdefcpdef方法。因此,使用什么关键字来定义它只是语言设计的问题(无论您选择什么,它总是以相同的方式调用)。就它接受的参数而言,它的行为类似于 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com