<分区>
我有一个使用 OpenCV 的 python 程序。该程序目前按预期运行。现在我想使用 Cython 将我的 python 代码编译为 C 代码。我这样做而不是用 C 语言重写整个程序,因为我仍然希望其他 python 程序能够import my_program
。
我以前从未使用过 Cython,但刚刚阅读了几篇关于它的博客文章。有人能告诉我我应该准备什么吗?这将是一项艰巨的任务……我目前的 python 程序是 ~200 LoC。
<分区>
我有一个使用 OpenCV 的 python 程序。该程序目前按预期运行。现在我想使用 Cython 将我的 python 代码编译为 C 代码。我这样做而不是用 C 语言重写整个程序,因为我仍然希望其他 python 程序能够import my_program
。
我以前从未使用过 Cython,但刚刚阅读了几篇关于它的博客文章。有人能告诉我我应该准备什么吗?这将是一项艰巨的任务……我目前的 python 程序是 ~200 LoC。
最佳答案
根据您的评论,您希望“按原样”运行现有代码以避免提供源代码,而不是进行任何重大更改以使用 Cython 特定的功能。考虑到这一点,我希望它能够在没有任何重大努力的情况下工作。一种可以考虑的简单替代方法是只提供 pyc 字节码文件。
下面列出了我所知道的小陷阱(按重要性大致排序)。列出了其他一些 in the documentation .其中大部分都是次要的,所以你会不幸遇到它们。
您可能必须针对每个平台(32 位和 64 位)、使用的每个(主要版本,例如 3.4、3.5)Python 重新编译您的模块,并且可能在具有多个不同编译器的 Windows 上重新编译。
您不能在模块级别使用 __file__
。在尝试查找与您的代码存储在同一位置的静态资源的路径时,这有时会成为一个问题。
一些试图通过检查堆栈(查看在调用它们的函数中定义了哪些变量)来做聪明事情的事情会中断,例如 some of sympy可能还有一些字符串格式化的快捷方式(see for example 对于一些可能使用这个想法的食谱)
任何查看函数字节码的东西(因为它不是由 Cython 生成的)。 Numba 可能是数值 python 中最常用的示例,但我至少知道一个(未维护)MATLAB/Python wrapper检查调用函数的字节码以尝试计算出返回的参数数量。
String concatenation can go through a fast path in Python that Cython doesn't manage .无论如何,你不应该在你的代码中做太多,但如果你依赖它,你可能会看到很大的性能差异。
关于python - 将 python 代码转换为 cython,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36539350/