【问题标题】:why is cpdef not used with __init__ in cython为什么 cpdef 在 cython 中不与 __init__ 一起使用
【发布时间】:2015-07-26 17:12:24
【问题描述】:

在阅读有关课程的 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__ 部分?

【问题讨论】:

  • __init____cinit__ 是对象的构造函数。在一个设计良好的程序中,您通常在构造函数中没有任何时间关键计算。 __cinit____init__ 也不等同。如果您必须初始化对象的c 部分(例如malloc),那么这发生在__cinit__ 中,而正常的python 初始化发生在__init__
  • 我明白这一点(这也在文档中)。我想问的是为什么代码使用def __init__ 而不是说cpdef __init__
  • 我不确定cpdef __init__ 是否有效。除此之外 - 我看不出这样做的理由。为什么你更喜欢cpdef

标签: cython


【解决方案1】:

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 指针)。


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-06
    • 1970-01-01
    • 2022-07-11
    • 1970-01-01
    相关资源
    最近更新 更多