【发布时间】:2018-08-16 18:31:41
【问题描述】:
假设我想要获得最佳性能,我如何知道在定义 Cython 函数时是使用 def、cdef 还是 cpdef?
【问题讨论】:
标签: function cython definition function-definition
假设我想要获得最佳性能,我如何知道在定义 Cython 函数时是使用 def、cdef 还是 cpdef?
【问题讨论】:
标签: function cython definition function-definition
如果您想要获得最佳性能,您应该知道this answer 中提到的相关问题:
一旦函数被调用,
cdef和def函数内的代码运行速度就没有区别了。
因此,为了获得最佳 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 调用该函数)产生以下结果:
【讨论】: