pxd 文件

注意

此页面使用两种不同的语法变体

  • Cython 特定的 cdef 语法,旨在使类型声明简洁,并易于从 C/C++ 的角度阅读。

  • 纯 Python 语法,允许在 纯 Python 代码 中进行静态 Cython 类型声明,遵循 PEP-484 类型提示和 PEP 526 变量注释。

    要在 Python 语法中使用 C 数据类型,您需要在要编译的 Python 模块中导入特殊的 cython 模块,例如

    import cython
    

    如果您使用纯 Python 语法,我们强烈建议您使用最近的 Cython 3 版本,因为与 0.29.x 版本相比,这里已经进行了重大改进。

除了 .pyx.py 源文件之外,Cython 还使用 .pxd 文件,这些文件的工作方式类似于 C 头文件——它们包含仅供 Cython 模块包含的 Cython 声明(有时还包含代码部分)。.pxd 文件通过使用 cimport 关键字导入到 .pyx 模块中。

.pxd 文件有许多用例

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

  2. 它们可以包含适合由 C 编译器内联的函数。此类函数应标记为 inline,例如

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

在我们的集成示例中,我们可以将其分解为 .pxd 文件,如下所示

  1. 添加一个 cmath.pxd

    cmath.pxd
    cdef extern from "math.h":
        cpdef double sin(double x)
    

    然后,您只需执行以下操作

    integrate.py
    from cython.cimports.cmath import sin
    

    警告

    上面/此页面提供的代码通过 cimport (cython.cimports) 使用外部本机(非 Python)库。Cython 编译启用了此功能,但纯 Python 不支持此功能。尝试从 Python(不进行编译)运行此代码将在访问外部库时失败。这在 调用 C 函数 中有更详细的描述。

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

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

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

__init__.pxd

Cython 还支持 __init__.pxd 文件,用于在包的命名空间中进行声明,类似于 Python 中的 __init__.py 文件。

继续集成示例,我们可以将模块打包如下

  1. 将模块文件放置在通常用于 Python 的目录树中

    CyIntegration/
    ├── __init__.py
    ├── __init__.pxd
    ├── integrate.py
    └── integrate.pxd
    
  2. __init__.pxd 中,使用 cimport 来声明任何希望在包的主命名空间中可用的声明

    from cython.cimports.CyIntegration import integrate
    

    然后,其他模块就可以使用 cimport 来导入该包,从而递归地获得对整个包及其模块中声明的数据的更快、更有效的 Cython 访问

    from cython.cimports import CyIntegration
    
    @cython.ccall
    def do_integration(f: CyIntegration.integrate.Function):
        return CyIntegration.integrate.integrate(f, 0., 2., 1)
    

    警告

    上面/此页面提供的代码通过 cimport (cython.cimports) 使用外部本机(非 Python)库。Cython 编译启用了此功能,但纯 Python 不支持此功能。尝试从 Python(不进行编译)运行此代码将在访问外部库时失败。这在 调用 C 函数 中有更详细的描述。