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
文件有许多用例
它们可以用于共享外部 C 声明。
它们可以包含适合由 C 编译器内联的函数。此类函数应标记为
inline
,例如cdef inline int int_min(int a, int b): return b if b < a else a
当与同名
.pyx
/.py
文件一起使用时,它们为 Cython 模块提供一个 Cython 接口,以便其他 Cython 模块可以使用比 Python 更有效的协议与它进行通信。
在我们的集成示例中,我们可以将其分解为 .pxd
文件,如下所示
添加一个
cmath.pxd
cdef extern from "math.h": cpdef double sin(double x)
然后,您只需执行以下操作
from cython.cimports.cmath import sin
警告
上面/此页面提供的代码通过
cimport
(cython.cimports
) 使用外部本机(非 Python)库。Cython 编译启用了此功能,但纯 Python 不支持此功能。尝试从 Python(不进行编译)运行此代码将在访问外部库时失败。这在 调用 C 函数 中有更详细的描述。from cmath cimport sin
添加一个
integrate.pxd
,以便其他用 Cython 编写的模块可以定义快速自定义函数来进行积分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
文件。
继续集成示例,我们可以将模块打包如下
将模块文件放置在通常用于 Python 的目录树中
CyIntegration/ ├── __init__.py ├── __init__.pxd ├── integrate.py └── integrate.pxd
CyIntegration/ ├── __init__.pyx ├── __init__.pxd ├── integrate.pyx └── integrate.pxd
在
__init__.pxd
中,使用cimport
来声明任何希望在包的主命名空间中可用的声明from cython.cimports.CyIntegration import integrate
from CyIntegration cimport 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 函数 中有更详细的描述。cimport CyIntegration cpdef do_integration(CyIntegration.integrate.Function f): return CyIntegration.integrate.integrate(f, 0., 2., 1)