将Python(可能通过中间C表示)编译成机器代码是否可行?
据推测,它需要链接到Python运行时库,Python标准库的任何Python部分本身都需要编译(并链接).
此外,如果您想对表达式进行动态评估,则需要捆绑Python解释器,但也许不允许这样做的Python子集仍然有用.
它会提供任何速度和/或内存使用优势吗?据推测,Python解释器的启动时间将被消除(尽管共享库仍需要在启动时加载).
正如@Greg Hewgill所说,有充分的理由说明为什么这并不总是可行的.但是,某些类型的代码(如非常算法代码)可以转换为"真正的"机器代码.
有几种选择:
使用Psyco,动态发出机器代码.但是,您应该仔细选择要转换的方法/功能.
使用Cython,这是一种类似 Python的语言,编译成Python C扩展
使用PyPy,它有一个来自RPython(Python的一个受限制的子集,不支持Python的一些最"动态"特性)到C或LLVM的转换器.
PyPy仍然是高度实验性的
并非所有扩展都会出现
之后,您可以使用现有的一个包(freeze,Py2exe,PyInstaller)将所有内容放入一个二进制文件中.
总而言之:你的问题没有一般答案.如果您的Python代码对性能至关重要,请尝试使用尽可能多的内置功能(或者询问"如何使我的Python代码更快"问题).如果这没有用,请尝试识别代码并将其移植到C(或Cython)并使用扩展名.
尝试使用ShedSkin Python-to-C++编译器,但它远非完美.还有Psyco - Python JIT,如果只需要加速.但恕我直言,这不值得努力.对于速度至关重要的代码部分,最佳解决方案是将它们编写为C/C++扩展.
py2c(http://code.google.com/p/py2c)可以将python代码转换为c/c ++我是py2c的独立开发人员.
PyPy是一个在Python中重新实现Python的项目,使用编译到本机代码作为实现策略之一(其他是使用JIT的VM,使用JVM等).他们编译的C版本平均比CPython慢,但对某些程序来说要快得多.
Shedskin是一个实验性的Python-to-C++编译器.
Pyrex是专为编写Python扩展模块而设计的语言.它旨在弥合优秀的,高级的,易于使用的Python世界与凌乱的低级别C世界之间的差距.
Nuitka是一个Python到C++编译器,它链接到libpython.这似乎是一个相对较新的项目.作者声称在pystone基准测试中CPython 的速度有所提高.
Pyrex是Python语言的一个子集,它编译为C语言,由最初为Python 构建列表推导的人完成.它主要是为构建包装器而开发的,但可以在更一般的环境中使用. Cython是一个更积极维护的派雷克斯叉.
这似乎是合理的第一眼,但是也有很多的Python中普通的东西没有直接可映射到一个C表示没有带过很多Python运行时支持.例如,想到鸭子打字.Python中用于读取输入的许多函数可以采用文件或类文件对象,只要它支持某些操作,例如.read()或readline().如果你仔细想想怎样才能映射这种类型到C的支持,你就开始正是想象各种各样的事情,Python运行时系统已经做.
有一些实用程序,如py2exe,它将Python程序和运行时捆绑到一个可执行文件中(尽可能).
一些额外的参考:
https://github.com/dropbox/pyston是Dropbox开发的Python的JIT编译器
http://pythran.readthedocs.io/是用于科学计算的C++转换器的编译时python
https://github.com/cosmo-ethz/hope是一个用于科学计算的C++翻译器的JIT python