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

标签 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__ 中的部分和代码,我们可以让它们运行得更慢。部分?

最佳答案

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/

相关文章:

python - 在 Cython 中将 Python 列表转换为 Vector<int>

python - 无法从 Cython 扩展覆盖类的 __init__

python - DFS 的 Cython 并行化竞争条件

python - 链接外部 C 库时来自 Cython 的 ImportError

python - cppclass Cython/C++ 定义中的重载是否被破坏?

cython - Cython中的extra_compile_args

opencv - 将 cython 内存 View 传递给 OpenCV 函数

python - 使用 pandas 进行代码/循环优化以创建两个矩阵

python - 使用 python-c-api 调用的 Cython 回调段错误

python - Cython 与 Python 3.3