如果我想要最佳性能,我怎么知道在定义Cython函数时是使用def,cdef还是cpdef?
答案 0 :(得分:11)
如果您想获得最佳效果,您应该知道this answer中提到的相关问题:
调用函数后,
cdef
和def
函数内的代码运行速度没有差异。
因此,为了获得最佳的Cython性能,您应该始终静态地键入所有参数和变量,直觉上您会想要使用cdef
,但有一些警告我构建了下面的流程图(也基于前面提到的答案):
此外,请注意:
cpdef
函数使Cython生成cdef
函数(允许从Cython快速调用函数)和def
函数(允许您从Python调用它)。在def
函数中,只调用cdef
函数。
......并且来自Cython文档:
这利用了早期绑定,因此在使用C基本类型时(使用
cpdef
),cdef
函数可能会尽可能快。cpdef
函数在传递Python对象时使用动态绑定,这可能会慢得多,可能与def
声明的函数一样慢。
还存在case-specific benchmark in the Cython documentation(经常从Python调用函数),它产生以下结果: