11

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

4

1 回答 1

24

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

cdef一旦函数被调用,a和函数中的代码运行速度就没有区别了def

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

def, cdef, cpdef 流程图

此外,请注意:

cpdef函数使 Cython 生成一个cdef函数(允许从 Cython 快速调用函数)和一个def函数(允许您从 Python 调用它)。内部def函数只是调用cdef函数。

...以及来自 Cython 文档:

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

Cython 文档中还存在一个特定于案例的基准测试(经常从 Python 调用该函数),它产生以下结果:

在此处输入图像描述

于 2018-03-08T11:58:05.927 回答