将Python程序转换为C / C ++代码?[关闭]


149

是否可以将Python程序转换为C / C ++?

我需要实现一些算法,而且我不确定性能差距是否足够大,足以证明我在C / C ++中做的所有痛苦(我不擅长)。我考虑过要编写一个简单的算法,并针对这种转换后的解决方案进行基准测试。如果仅此一项比Python版本要快得多,那么除了在C / C ++中做到这一点,我别无选择。


32
尽管Python在基准测试中损失惨重,但请记住,如果在几秒钟内用Python完成计算,则50倍或100倍的减速仍然可以忽略不计,而当您执行大量I / O或使用可怕的算法时,这种情况甚至不成立。而不是问“ Python的速度慢了多少?” 您应该问“ Python是否足够快?” (坦白地说,这是最恰当的)-这也比基准测试或在此处询问要快。

1
在python中实现算法是非常快速和直接的...您只需要执行它,然后检查它是否足够快。大多数时候,您可以使用不同的数据结构(dict / sets而不是list ...)或不同的操作来优化算法,以更快地运行。应该发生反正优化后,你已经实现的算法的第一稿和基准/异形它。
Bakuriu 2011年

@delnan:就我而言,这全都与计算时间有关。如果C变体需要的时间减少x个小时,那么我会花时间让算法再次运行更长或更长时间。我只是想了解(大概)Python会慢多少-如果仅仅几个小时,我当然不会使用我不适应的语言(您可能会破坏实现不好的问题的最佳解决方案: P)。
CrazyFlyingCloseline 2011年

@delnan关于Python的权利可能足够快来完成许多事情。即使速度变慢,开发,维护和将来增强的便利性也是要考虑的重要因素。
martineau 2011年

“ x小时”?这有多大?您是否基准化了实施?你有尺寸吗?您是否介绍了实施情况?还是您正在尝试过早地优化解决方案?
S.Lott

Answers:


115

是。看赛顿。它就是这样做的:将Python转换为C以加快速度。


6
当然,除非您添加一堆cdef声明并由此引入静态类型(否则,您只是在处理不透明的PyObject *内容),那将不会为您节省任何费用。而且它永远不会像普通C那样快,因为它通常与Python交互(100%或更多?仅适用于大多数时间根本不与Python交互的普通数字代码!)。但是除此之外,是的,它可以使您获得极大的提速。

7
@delnan:实际上,它确实为您节省了一些。大多数纯Python代码在编译后会更快。但是,是的,使用cdef和静态类型,您确实开始看到差异。与Python的接口在所有情况下都可以从Python使用C。
Lennart Regebro 2011年

136

如果C变体所需的时间减少了x个小时,那么我会花时间让算法更长或更长时间地运行

“投资”在这里不是正确的词。

  1. 用Python构建有效的实现。在完成C版本之前,您将完成此工作很久。

  2. 使用Python分析器衡量性能。解决您发现的所有问题。根据实际需要更改数据结构和算法。您需要完成很长时间才能完成C中的第一个版本。

  3. 如果仍然太慢,请手动将精心设计和精心构建的Python转换为C。

    由于事后观察的工作方式,从现有的Python(使用现有的单元测试和现有的分析数据)执行第二版仍比尝试从头开始执行C代码要快。

这句话很重要。

汤普森首次望远镜制造商的规则制作
四英寸镜然后制作六英寸镜比制造六英寸镜要快。

比尔·麦肯南·
旺研究所


15
不管得分很高,我都看不出这是如何回答这个问题的。
奥德里斯·梅斯卡斯卡斯

29

Shed Skin是“(受限制的)Python到C ++的编译器”。


3
+1 Shed Skin的一个优点是类型推断:如果可以从程序流中猜测变量类型,则可以避免动态类型检查。通常,这会导致更短的C ++代码,实际上可以读取并编译为更快的程序。
凯斯·陶

1
还有Python→11l→C ++ transpiler,它也是C ++编译器的受限Python,但它支持某些Python功能,但Shed Skin不支持(例如嵌套函数/闭包)。
tav

17

刚刚在黑客新闻中遇到了这个新工具。

在他们的页面上-“ Nuitka是Python解释器的很好的替代品,它可以编译CPython 2.6、2.7、3.2和3.3提供的每个构造。它将Python转换为C ++程序,然后使用“ libpython”以与以下相同的方式执行CPython以一种非常兼容的方式做到了。”


这个项目比其他类似选项更加成熟。有趣的是.exe,即使它是完全正常的OSX Mach-O可执行文件,它也会在OSX上创建带有扩展名的二进制文件。像它看起来可能是一个很好的替代pyinstallerpy2exepy2app,等的--recurse-***标志,虽然正确设置很重要。
ccpizza

Nuitka很棒,但是创建的C / C ++代码使用的是绑定到CPython-C代码实现的PyObject。它不会产生惯用的C代码。
Make42

8

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。您还应该注意,开发团队非常友好,往往会在几个小时内修复错误。


6

我知道这是一个较旧的主题,但是我想提供我认为是有用的信息。

我个人使用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代码,我并没有真正查看或查看它是否有用或只是乱码。祝好运。

希望有帮助。


2
我知道这是一个较旧的评论,但谢谢!
kfrncs

没问题,我很高兴它很有用。
jacktrader19年

您使用什么软件从PyPy解释中进行编译?
Vasyl Vaskivskyi,

不特别是PyPy,只是.py脚本。如果您需要“ C / C ++可执行文件或C / C ++源代码”,则为Nuitka;如果仅需要可执行文件(更简便),则为PyInstaller。也有py2exe,但是我确信它的情况有所改善,但我获得的成功较少。PyInstaller也是跨平台的,不仅适用于Windows可执行文件(适用于Linux和Mac)。Nuitka之所以与众不同,是因为我认为它是唯一可以为您提供可用的源代码的“编译器”,您可以在理论上进一步对其进行优化。还有其他一些,例如bbFreeze,cx_Freeze和py2app,但我还没有尝试过。祝你好运!
jacktrader

1
我还发现PyPy的运行速度比Cython快。在一个测试中,我实际上发现PyPy与程序的C ++版本(插入排序)的速度相同。
Nv7

5

我意识到缺少一个全新解决方案的答案。如果在代码中使用了Numpy,我建议尝试使用Pythran:

http://pythran.readthedocs.io/

对于我尝试过的功能,Pythran提供了非常好的结果。所产生的功能与已编写好的Fortran代码一样快(或稍慢),并且比(相当优化的)Cython解决方案快一点。

与Cython相比,优点是您只需要在针对Numpy优化的Python函数上使用Pythran,这意味着您不必扩展循环并为循环中的所有变量添加类型。Pythran花费时间分析代码,因此可以理解上的操作numpy.ndarray

与Numba或其他基于即时编译的项目相比,这也是一个巨大的优势(据我所知),对于这些项目,您必须扩展循环才能真正有效。然后仅使用CPython和Numpy,带有循环的代码效率非常低下...

Pythran的缺点:没有课程!但是由于只需要编译真正需要优化的功能,所以它并不是很烦人。

另一点:Pythran支持(非常容易)OpenMP并行性。但是我不支持mpi4py ...


4

http://code.google.com/p/py2c/似乎很可能-他们还在自己的网站上提到:Cython,Shedskin和RPython,并确认他们正在将Python代码转换为比C快得多的纯C / C ++。 / C ++充满了Python API调用。注意:我还没有尝试过,但是我要去做。


1
似乎Py2C仍未完成。它已经有几年没有更新了,所以可能已经不存在了。
安德森·格林
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.