将Python程序转换为C / C ++代码?

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

我需要实现几个algorithm,而且我不确定性能差距是否足够大,足以certificate我在C / C ++(我不擅长)时所经历的所有痛苦。 我想写一个简单的algorithm,并针对这种转换的解决scheme进行基准testing。 如果仅仅这一点比Python版本快得多,那么除了在C / C ++中做这个,我没有别的select。

是。 看看Cython 。 它只是这样做:将Python转换为C来加速。

如果C变体需要x小时,那么我会投入那些时间让algorithm运行更长时间

“投资”在这里是不对的。

  1. 用Python构build一个工作实现。 在完成C版本之前,你会完成这个任务。

  2. 使用Python分析器来衡量性能。 解决你发现的任何问题。 根据需要更改数据结构和algorithm,以便真正做到这一点。 在C完成第一个版本之前,你会完成这个任务

  3. 如果仍然太慢,请将精心devise并精心构造的Python手动转换为C.

    由于后见之明的工作方式,从现有的Python(与现有的unit testing,并与现有的分析数据)做第二个版本,仍然会比从头开始做C代码更快。

这句话很重要。

汤普森的第一次望远镜制造商的规则
制作一个四英寸镜子和一个六英寸镜子要比制作一个六英寸镜子要快。

Bill McKeenan
王研究所

棚皮是“一个(限制)的Python到C ++编译器”。

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

从他们的页面 – “Nuitka是Python解释器的一个很好的替代品,并且编译CPython 2.6,2.7,3.2和3.3提供的每个构造。它将Python翻译成C ++程序,然后使用”libpython“以与CPython以一种非常兼容的方式。“

http://code.google.com/p/py2c/看起来像是一种可能性; – 他们还在他们的网站上提到:Cython,Shedskin和RPython,并确认他们将Python代码转换为纯C / C ++,这比C更快/ C ++充斥着Python API调用。 注:我没有尝试过,但我要..

另一种select – 转换为C ++除了棚子皮肤 – 是Pythran 。

引用Micha Gorelick和Ian Ozsvald的高性能Python

Pythran是一个Python-to-C ++编译器,用于包含部分numpy支持的Python子集。 它的行为有点像Numba和Cython – 你注释一个函数的参数,然后它接pipe进一步的types注释和代码特化。 它利用了vector化可能性和基于OpenMP的并行化可能性。 它只使用Python 2.7运行。

Pythran的一个非常有趣的function是,它会尝试自动发现并行机会(例如,如果您使用的是map ),并将其转换为并行代码,而不需要您付出额外的努力。 你也可以使用pragma omp指令指定平行部分; 在这方面,它与Cython的OpenMP支持非常相似。

在幕后,Pythran将采用普通的Python和numpy代码,并试图积极地将它们编译成非常快速的C ++ – 甚至比Cython的结果还要快。

你应该注意到这个项目是年轻的,你可能会遇到错误; 你还应该注意到开发团队非常友好,并且在几个小时内就可以修复bug。

我知道这是一个较旧的线程,但我想给我所认为有用的信息。

我个人使用PyPy这是很容易安装使用PIP。 我可以互换使用Python / PyPy解释器,你根本不需要改变你的代码,而且我发现它比标准的Python解释器(Python 2x或者3x)快大约40倍。 我使用pyCharm社区版来pipe理我的代码,我喜欢它。

我喜欢用python编写代码,因为我认为它可以让你更专注于任务而不是语言,这对我来说是一个巨大的优势。 如果你需要它更快,你可以将它编译成Windows,Linux或Mac的二​​进制文件。 从我的经验来看,编译时PyPy的速度提高了3.5倍,比python快了140倍。 PyPy可用于Python 3x和2x代码,如果您使用像PyCharm这样的IDE,则可以非常容易地在PyPy,Cython和Python之间进行交换(尽pipe需要一些初始学习)。

有人可能会和我争论,但我发现PyPy比Cython快。 不过他们都是很好的select。

编辑:我想就编译做一个快速的说明:编译时,生成的二进制比python脚本大得多,因为它build立了所有的依赖,等等。但是,你会得到一些明显的好处:速度!现在应用程序可以在任何机器上工作(取决于你编译的操作系统,如果不是全部的话),没有Python或库,它也混淆了你的代码,并在技术上'生产'准备就绪。 一些编译器也生成C代码,我没有真正看过或看到它是有用的或只是胡言乱语。 祝你好运。

希望有所帮助。

我意识到,一个很新的解决scheme的答案是失踪。 如果在代码中使用Numpy,我会build议尝试Pythran:

http://pythran.readthedocs.io/

对于我试过的function,Pythran给出了非常好的结果。 由此产生的函数与编写Fortran代码一样快(或者只是稍微慢一点),比(相当优化的)Cython解决scheme稍快一点。

与Cython相比,它的优势在于你只需要使用Pythran来优化Numpy的Python函数,这意味着你不必为循环中的所有variables扩展循环和添加types。 Pythran花时间分析代码,以便理解numpy.ndarray上的操作。

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

Pythran的缺点:没有课程! 但是因为只有真正需要优化的function需要编译,所以不是很烦人。

还有一点:Pythran很好地(很容易)支持OpenMP并行性。 但我不认为mpi4py支持…