最近我必须将纯Python编写的模块转换为pyx,以便用cython进行编译。 从 py 转换为 pyx 的过程非常简单,因为所有变量和函数都有类型提示。所以这只是在 python 中查找每种类型的 cython 静态类型的问题。
考虑到原始代码中 Python 类型提示的使用,当前有哪些选项可用于自动将纯 Python 编写的模块转换为 Cython,特别是用于将 .py 文件转换为 .pyx 文件?是否有任何现有模块或工具可以促进此过程?如果否,理论上是否可以开发一个可以自动将 Python 类型提示转换为 Cython 静态类型的模块,如果可以,开发这样的模块可能会遇到哪些挑战?
Cython 已经使用 Python 类型注释,所以你很可能不需要做任何事情。
有一些小注意事项:
int
是 Python 对象而不是 C int,以避免大整数溢出并保持语义与 Python 相同。使用 cython.int
作为 C int 的注释。“更多说明:”Cython 对于类型注释通常相当保守。它假设注释是正确的,但这并不是为了它的好处。因此,它不会做注释可能会改变答案的事情。
int
是主要示例 - Python 整数可以无限大,而 C 整数具有固定的最大值。因此,Cython 不会 将 int
注释更改为 C int,因为结果可能会改变。显然,如果您对潜在的不同行为感到满意,您可以自己进行更改。
如果您想自动化完全转换,那么内置
ast
模块可能是最简单的方法。为了简单起见,我仍然建议坚持使用“纯 Python 模式”,因为 ast
模块可以生成 Python 代码。但本质上,您要做的是创建一个查找注释的访问者(即 ast.AnnAssign
、ast.Arg
)并将其替换为适当的 Cython 友好注释。然后,您可以使用 ast.dump
重写修改后的代码。