python - 将 python 代码转换为 cython

标签 python opencv cython

<分区>

我有一个使用 OpenCV 的 python 程序。该程序目前按预期运行。现在我想使用 Cython 将我的 python 代码编译为 C 代码。我这样做而不是用 C 语言重写整个程序,因为我仍然希望其他 python 程序能够import my_program

我以前从未使用过 Cython,但刚刚阅读了几篇关于它的博客文章。有人能告诉我我应该准备什么吗?这将是一项艰巨的任务……我目前的 python 程序是 ~200 LoC。

最佳答案

根据您的评论,您希望“按原样”运行现有代码以避免提供源代码,而不是进行任何重大更改以使用 Cython 特定的功能。考虑到这一点,我希望它能够在没有任何重大努力的情况下工作。一种可以考虑的简单替代方法是只提供 pyc 字节码文件。

下面列出了我所知道的小陷阱(按重要性大致排序)。列出了其他一些 in the documentation .其中大部分都是次要的,所以你会不幸遇到它们。

  1. 您可能必须针对每个平台(32 位和 64 位)、使用的每个(主要版本,例如 3.4、3.5)Python 重新编译您的模块,并且可能在具有多个不同编译器的 Windows 上重新编译。

  2. 您不能在模块级别使用 __file__。在尝试查找与您的代码存储在同一位置的静态资源的路径时,这有时会成为一个问题。

  3. 一些试图通过检查堆栈(查看在调用它们的函数中定义了哪些变量)来做聪明事情的事情会中断,例如 some of sympy可能还有一些字符串格式化的快捷方式(see for example 对于一些可能使用这个想法的食谱)

  4. 任何查看函数字节码的东西(因为它不是由 Cython 生成的)。 Numba 可能是数值 python 中最常用的示例,但我至少知道一个(未维护)MATLAB/Python wrapper检查调用函数的字节码以尝试计算出返回的参数数量。

  5. You must have an __init__.py file to make a folder into a module - it won't recognise a compiled __init__.so file on its own .

  6. 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/

相关文章:

python - 使用 Pandas 将多列映射到单个数据框

python - 从pandas中的多级groupby中进行选择

python - 将连接的组件分离到多个图像

opencv - 如何将视频(帧)输入 GLSL 着色器

python - 使用 cython 对 python 中的小数组进行高效的数学操作

python - 如何为 Windows 编译 cymunk?

python - 转换 HH :MM to minutes 的 pandas 中的列

python - Python:solvePnP()没有足够的值可解包?

python - 将 .py 编译为 .pyd 时如何修复 "cannot find -lvcruntime140.dll"?

Python SocketServer 收不到所有数据