【问题标题】:Should I define my Cython function using def, cdef, or cpdef for optimal performance?我应该使用 def、cdef 或 cpdef 定义我的 Cython 函数以获得最佳性能吗?
【发布时间】:2018-08-16 18:31:41
【问题描述】:

假设我想要获得最佳性能,我如何知道在定义 Cython 函数时是使用 def、cdef 还是 cpdef?

【问题讨论】:

    标签: function cython definition function-definition


    【解决方案1】:

    如果您想要获得最佳性能,您应该知道this answer 中提到的相关问题:

    一旦函数被调用,cdefdef 函数内的代码运行速度就没有区别了。

    因此,为了获得最佳 Cython 性能,您应该始终静态键入所有参数和变量,然后直观地您会很想使用 cdef,但我构建了下面的流程图有一些注意事项(也基于前面提到的答案):

    此外,请注意:

    cpdef 函数使 Cython 生成一个 cdef 函数(允许从 Cython 进行快速函数调用)和一个 def 函数(允许您从 Python 调用它)。其中,def 函数只调用了cdef 函数。

    ...以及来自 Cython 文档:

    这利用了早期绑定,因此cpdef 函数在使用 C 基本类型时可能尽可能快(通过使用 cdef)。 cpdef 函数在传递 Python 对象时使用动态绑定,这可能会慢得多,可能与 def 声明的函数一样慢。

    还有一个case-specific benchmark in the Cython documentation(经常从 Python 调用该函数)产生以下结果:

    【讨论】:

      猜你喜欢
      • 2015-04-06
      • 2012-07-27
      • 2013-05-07
      • 2018-07-29
      • 1970-01-01
      • 2018-12-19
      • 2010-09-18
      • 1970-01-01
      相关资源
      最近更新 更多