Skip to content

Files

Latest commit

ee5c001 · Jul 31, 2023

History

History
66 lines (56 loc) · 2.41 KB

12.md

File metadata and controls

66 lines (56 loc) · 2.41 KB

pxd 文件

原文: http://docs.cython.org/en/latest/src/tutorial/pxd_files.html

除了.pyx源文件之外,Cython 还使用.pxd文件,它们的工作方式类似于 C 头文件 - 它们包含 Cython 声明(有时是代码部分),仅供 Cython 模块使用。在pyx模块可以使用cimport关键字将pxd文件导入。

pxd文件有很多使用场景:

  1. 它们可用于共享外部 C 声明。

  2. 它们可以包含非常适合 C 编译器内联的函数。这些功能应标记为inline,例如:

    cdef inline int int_min(int a, int b):
        return b if b < a else a
  3. 当附带同名的pyx文件时,它们为 Cython 模块提供了一个 Cython 接口,以便其他 Cython 模块可以使用比 Python 更高效的协议与之通信。

在我们的积分函数案例中,我们可能会将其分解为多个pxd文件,如下所示:

  1. 添加cmath.pxd,定义 C math.h头文件中可用的 C 函数,如sin。以后仅需在integrate.pyx中做from cmath cimport sin即可使用。

  2. 添加integrate.pxd,以便用 Cython 编写的其他模块可以快速的自定义积分函数。

    cdef class Function:
        cpdef evaluate(self, double x)
    cpdef integrate(Function f, double a,
                    double b, int N)

    请注意,如果您的 cdef 类具有属性,则必须在类声明pxd文件(如果使用)中声明属性,而不是pyx文件。编译器会告诉你这个。

__init__.pxd

Cython也支持使用__init__.pxd文件来在包命名空间内进行声明,就像是Python中的__init__.py文件一样。

接着积分函数这个例子说,我们可以通过如下方式将模块代码打包。

  1. 将模块文件放在一个目录树下,就像是Python中一样。

    CyIntegration/
     __init__.pyx
     __init__.pxd
     integrate.pyx
     integrate.pxd
  2. __init__.pxd文件中,使用cimport引入需要在包命名空间中可见的声明

    from CyIntegration cimport integrate

这样,其他模块就可以通过cimport这个包来通过Cython的方式更快的访问包内容和数据。