是否可以将Python程序转换为C / C ++?
我需要实现一些算法,而且我不确定性能差距是否足够大,足以证明我在C / C ++中做的所有痛苦(我不擅长)。我考虑过要编写一个简单的算法,并针对这种转换后的解决方案进行基准测试。如果仅此一项比Python版本要快得多,那么除了在C / C ++中做到这一点,我别无选择。
是否可以将Python程序转换为C / C ++?
我需要实现一些算法,而且我不确定性能差距是否足够大,足以证明我在C / C ++中做的所有痛苦(我不擅长)。我考虑过要编写一个简单的算法,并针对这种转换后的解决方案进行基准测试。如果仅此一项比Python版本要快得多,那么除了在C / C ++中做到这一点,我别无选择。
Answers:
是。看赛顿。它就是这样做的:将Python转换为C以加快速度。
cdef
声明并由此引入静态类型(否则,您只是在处理不透明的PyObject *
内容),那将不会为您节省任何费用。而且它永远不会像普通C那样快,因为它通常与Python交互(100%或更多?仅适用于大多数时间根本不与Python交互的普通数字代码!)。但是除此之外,是的,它可以使您获得极大的提速。
如果C变体所需的时间减少了x个小时,那么我会花时间让算法更长或更长时间地运行
“投资”在这里不是正确的词。
用Python构建有效的实现。在完成C版本之前,您将完成此工作很久。
使用Python分析器衡量性能。解决您发现的所有问题。根据实际需要更改数据结构和算法。您需要完成很长时间才能完成C中的第一个版本。
如果仍然太慢,请手动将精心设计和精心构建的Python转换为C。
由于事后观察的工作方式,从现有的Python(使用现有的单元测试和现有的分析数据)执行第二版仍比尝试从头开始执行C代码要快。
这句话很重要。
汤普森首次望远镜制造商的规则制作
四英寸镜然后制作六英寸镜比制造六英寸镜要快。比尔·麦肯南·
旺研究所
刚刚在黑客新闻中遇到了这个新工具。
在他们的页面上-“ Nuitka是Python解释器的很好的替代品,它可以编译CPython 2.6、2.7、3.2和3.3提供的每个构造。它将Python转换为C ++程序,然后使用“ libpython”以与以下相同的方式执行CPython以一种非常兼容的方式做到了。”
.exe
,即使它是完全正常的OSX Mach-O可执行文件,它也会在OSX上创建带有扩展名的二进制文件。像它看起来可能是一个很好的替代pyinstaller
,py2exe
,py2app
,等的--recurse-***
标志,虽然正确设置很重要。
Pythran是除Shed Skin之外还可以转换为C ++的另一种选择。
引用Micha Gorelick和Ian Ozsvald的高性能Python:
Pythran是一个Python到C ++的编译器,用于部分
numpy
支持的Python子集。它的行为有点像Numba和Cython,您可以对函数的参数进行注释,然后由进一步的类型注释和代码专门化来接管。它利用了矢量化可能性和基于OpenMP的并行化可能性。它仅使用Python 2.7运行。Pythran的一个非常有趣的功能是它将尝试自动发现并行化机会(例如,如果您使用
map
),并将其转换为并行代码,而无需您付出额外的努力。您也可以使用pragma omp
>指令指定并行节;在这方面,它与Cython的OpenMP支持非常相似。在幕后,Pythran将同时使用普通的Python和numpy代码,并试图将它们积极地编译成非常快的C ++,甚至比Cython的结果还要快。
您应该注意,这个项目还很年轻,并且可能会遇到bug。您还应该注意,开发团队非常友好,往往会在几个小时内修复错误。
我知道这是一个较旧的主题,但是我想提供我认为是有用的信息。
我个人使用PyPy,使用pip真的很容易安装。我可以互换地使用Python / PyPy解释器,您根本不需要更改代码,我发现它比标准python解释器(Python 2x或3x)快40倍左右。我使用pyCharm Community Edition管理我的代码,我喜欢它。
我喜欢用python编写代码,因为我认为它可以使您更多地专注于任务而不是语言,这对我来说是一个巨大的优势。而且,如果您需要更快的速度,则始终可以将其编译为适用于Windows,Linux或Mac的二进制文件(不是直接的,但可以使用其他工具)。根据我的经验,编译时我的速度是PyPy的3.5倍,这比python快140倍。PyPy适用于Python 3x和2x代码,如果使用像PyCharm这样的IDE,则可以很容易地在PyPy,Cython和Python之间互换(尽管需要一些初始学习和设置)。
有人可能在这一点上与我争论,但我发现PyPy比Cython快。但是它们都是不错的选择。
编辑:我想对编译做个简短的说明:编译时,生成的二进制文件比python脚本大得多,因为它在其中建立了所有依赖关系,等等。但是随后您得到了一些明显的好处:速度!,现在,该应用程序可以在没有Python或库的任何机器上运行(取决于所编译的操作系统(如果不是全部,则取决于.lol)),而无需使用Python或库,它还会使您的代码变得模糊,并且在某种程度上从技术上来说已经准备好进行生产了。一些编译器还会生成C代码,我并没有真正查看或查看它是否有用或只是乱码。祝好运。
希望有帮助。
我意识到缺少一个全新解决方案的答案。如果在代码中使用了Numpy,我建议尝试使用Pythran:
http://pythran.readthedocs.io/
对于我尝试过的功能,Pythran提供了非常好的结果。所产生的功能与已编写好的Fortran代码一样快(或稍慢),并且比(相当优化的)Cython解决方案快一点。
与Cython相比,优点是您只需要在针对Numpy优化的Python函数上使用Pythran,这意味着您不必扩展循环并为循环中的所有变量添加类型。Pythran花费时间分析代码,因此可以理解上的操作numpy.ndarray
。
与Numba或其他基于即时编译的项目相比,这也是一个巨大的优势(据我所知),对于这些项目,您必须扩展循环才能真正有效。然后仅使用CPython和Numpy,带有循环的代码效率非常低下...
Pythran的缺点:没有课程!但是由于只需要编译真正需要优化的功能,所以它并不是很烦人。
另一点:Pythran支持(非常容易)OpenMP并行性。但是我不支持mpi4py ...
http://code.google.com/p/py2c/似乎很可能-他们还在自己的网站上提到:Cython,Shedskin和RPython,并确认他们正在将Python代码转换为比C快得多的纯C / C ++。 / C ++充满了Python API调用。注意:我还没有尝试过,但是我要去做。