将 Python 程序转换为 C/C++ 代码?[关闭]
- 2024-12-31 08:37:00
- admin 原创
- 42
问题描述:
可以将 Python 程序转换为 C/C++ 吗?
我需要实现几个算法,但我不确定性能差距是否大到足以弥补我在用 C/C++(我不擅长)实现时所经历的所有痛苦。我考虑编写一个简单的算法,并将其与转换后的解决方案进行基准测试。如果仅此一项就比 Python 版本快得多,那么我别无选择,只能用 C/C++ 来实现。
解决方案 1:
如果 C 版本需要的时间减少了 x 小时,那么我会将这段时间花在让算法运行更长时间/再次运行上
“投资”这个词在这里不太合适。
用 Python 构建一个工作实现。你将在完成 C 版本之前完成它。
使用 Python 分析器测量性能。修复您发现的任何问题。根据需要更改数据结构和算法以真正正确地完成此操作。您将在完成 C 中的第一个版本之前完成这项工作。
如果还是太慢,就手动将精心设计和构建的 Python 翻译成 C。
由于事后看来,使用现有 Python(使用现有单元测试和现有分析数据)执行第二个版本仍然比从头开始执行 C 代码更快。
这句话很重要。
汤普森针对首次制造望远镜的规则:
先制造一面四英寸的镜子,然后再制造一面六英寸的镜子,比制造一面六英寸的镜子要快。
比尔·麦基南
王研究所
解决方案 2:
是的。看看Cython。它的作用就是:将 Python 转换为 C 以提高速度。
解决方案 3:
Shed Skin是“一个(受限的)Python 到 C++ 编译器”。
来自文档:
Shed Skin 是一款实验性编译器,可以将纯 Python(2.4-2.6)程序(但隐式静态类型)转换为优化的 C++。它可以生成独立程序或扩展模块,这些模块可以导入到更大的 Python 程序中使用。
除了类型限制之外,程序无法自由使用 Python 标准库(尽管目前支持大约 25 个常用模块,例如
random
和re
)。此外,并非所有 Python 功能(例如嵌套函数和可变数量的参数)都受支持。
对于一组75 个非平凡程序(总共超过 25,000 行(sloccount)),测量表明,与 CPython 相比,速度通常提高 2-200 倍。
解决方案 4:
刚刚在黑客新闻中看到这个新工具。
在他们的页面上 - “Nuitka 是 Python 解释器的一个很好的替代品,可以编译 CPython 2.6、2.7、3.2 和 3.3 提供的每个结构。它将 Python 转换为 C++ 程序,然后使用“libpython”以与 CPython 相同的方式执行,而且非常兼容。”
解决方案 5:
我知道这是一个较老的话题但我想提供我认为有用的信息。
我个人使用 PyPy,使用 pip 安装起来非常简单。我交替使用 Python/PyPy 解释器,你根本不需要更改代码,我发现它比标准 Python 解释器(Python 2x 或 3x)快大约 40 倍。我使用 pyCharm 社区版来管理我的代码,我很喜欢它。
我喜欢用 Python 编写代码,因为我认为这样可以让你更专注于任务而不是语言,这对我来说是一个巨大的优势。如果你需要更快的速度,你总是可以编译为适用于 Windows、Linux 或 Mac 的二进制文件(不是直接编译,但可以使用其他工具)。根据我的经验,编译时我比 PyPy 的速度快 3.5 倍,也就是说比 Python 快 140 倍。PyPy 适用于 Python 3x 和 2x 代码,同样,如果你使用 PyCharm 之类的 IDE,你可以非常轻松地在 PyPy、Cython 和 Python 之间切换(不过需要一点初始学习和设置)。
有些人可能会在这一点上与我争论,但我发现 PyPy 比 Cython 更快。但它们都是很好的选择。
编辑:我想再简单说一下编译:编译时,生成的二进制文件比 Python 脚本大得多,因为它将所有依赖项都构建到其中,等等。但这样一来,您将获得一些明显的好处:速度!现在应用程序可以在任何机器上运行(取决于您为哪个操作系统编译,如果不是全部。哈哈),无需 Python 或库,它还会混淆您的代码,并且从技术上来说已准备好“投入生产”(在一定程度上)。一些编译器还会生成 C 代码,我还没有真正看过或看到它是否有用或只是胡言乱语。祝你好运。
希望有所帮助。
解决方案 6:
除了Shed Skin之外,转换为 C++ 的另一种选择是Pythran。
引用Micha Gorelick 和 Ian Ozsvald 所著的《高性能 Python》:
Pythran 是 Python 子集的 Python 到 C++ 编译器,包含部分
numpy
支持。它的作用有点像 Numba 和 Cython - 您注释函数的参数,然后它接管进一步的类型注释和代码专门化。它利用了矢量化可能性和基于 OpenMP 的并行化可能性。它仅使用 Python 2.7 运行。Pythran 的一个非常有趣的功能是,它会尝试自动发现并行化机会(例如,如果您使用
map
),并将其转换为并行代码,而无需您付出额外努力。您还可以使用pragma omp
> 指令指定并行部分;在这方面,它感觉非常类似于 Cython 的 OpenMP 支持。在幕后,Pythran 将采用普通的 Python 和 numpy 代码,并尝试将它们编译成非常快的 C++——甚至比 Cython 的结果还要快。
您应该注意到这个项目还很年轻,您可能会遇到错误;您还应该注意到开发团队非常友好,并且倾向于在几个小时内修复错误。
解决方案 7:
http://code.google.com/p/py2c/看起来是可行的 - 他们还在网站上提到:Cython、Shedskin 和 RPython,并确认他们正在将 Python 代码转换为纯 C/C++,这比充斥着 Python API 调用的 C/C++ 快得多。注意:我还没有尝试过,但我打算尝试一下。
解决方案 8:
我意识到缺少一个相当新的解决方案的答案。 如果在代码中使用了 Numpy,我建议尝试 Pythran:
http://pythran.readthedocs.io/
对于我尝试过的函数,Pythran 给出了非常好的结果。生成的函数与编写良好的 Fortran 代码一样快(或仅稍慢一点),并且比(相当优化的)Cython 解决方案快一点。
与 Cython 相比,其优势在于您只需要在针对 Numpy 优化的 Python 函数上使用 Pythran,这意味着您不必扩展循环并为循环中的所有变量添加类型。Pythran 会花时间分析代码,以便理解上的操作numpy.ndarray
。
与 Numba 或其他基于即时编译的项目相比,这也是一个巨大的优势,据我所知,你必须扩展循环才能真正提高效率。然后,如果只使用 CPython 和 Numpy,带有循环的代码就会变得非常低效……
Pythran 的一个缺点是:没有类!但由于只有真正需要优化的函数才需要编译,所以这并不令人讨厌。
另一点:Pythran 很好地(并且非常容易地)支持 OpenMP 并行性。但我不认为 mpi4py 受支持...
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理必备:盘点2024年13款好用的项目管理软件