将Python编译为机器代码是否可行?

And*_*aam 123 c python linker compilation

将Python(可能通过中间C表示)编译成机器代码是否可行?

据推测,它需要链接到Python运行时库,Python标准库的任何Python部分本身都需要编译(并链接).

此外,如果您想对表达式进行动态评估,则需要捆绑Python解释器,但也许不允许这样做的Python子集仍然有用.

它会提供任何速度和/或内存使用优势吗?据推测,Python解释器的启动时间将被消除(尽管共享库仍需要在启动时加载).

Tor*_*rek 53

正如@Greg Hewgill所说,有充分的理由说明为什么这并不总是可行的.但是,某些类型的代码(如非常算法代码)可以转换为"真正的"机器代码.

有几种选择:

  • 使用Psyco,动态发出机器代码.但是,您应该仔细选择要转换的方法/功能.
  • 使用Cython,这是一种类似 Python的语言,编译成Python C扩展
  • 使用PyPy,它有一个来自RPy​​thon(Python的一个受限制的子集,不支持Python的一些最"动态"特性)到C或LLVM的转换器.
    • PyPy仍然是高度实验性的
    • 并非所有扩展都会出现

之后,您可以使用现有的一个包(freeze,Py2exe,PyInstaller)将所有内容放入一个二进制文件中.

总而言之:你的问题没有一般答案.如果您的Python代码对性能至关重要,请尝试使用尽可能多的内置功能(或者询问"如何使我的Python代码更快"问题).如果这没有用,请尝试识别代码并将其移植到C(或Cython)并使用扩展名.

  • Pypy是Psyco的继承者 (3认同)

cle*_*leg 29

尝试使用ShedSkin Python-to-C++编译器,但它远非完美.还有Psyco - Python JIT,如果只需要加速.但恕我直言,这不值得努力.对于速度至关重要的代码部分,最佳解决方案是将它们编写为C/C++扩展.

  • 仅供参考,ShedSkin放弃了Windows支持. (5认同)
  • @sorin:嗯,今天它支持windows ... http://code.google.com/p/shedskin/downloads/detail?name=shedskin-0.9.1.exe&can=2&q= (2认同)
  • 最好的解决方案仍然是 [PyPy](http://morepypy.blogspot.nl/2011/08/pypy-is-faster-than-c-again-string.html)。 (2认同)

Ram*_*pte 18

py2c(http://code.google.com/p/py2c)可以将python代码转换为c/c ++我是py2c的独立开发人员.


pdc*_*pdc 14

PyPy是一个在Python中重新实现Python的项目,使用编译到本机代码作为实现策略之一(其他是使用JIT的VM,使用JVM等).他们编译的C版本平均比CPython慢​​,但对某些程序来说要快得多.

Shedskin是一个实验性的Python-to-C++编译器.

Pyrex是专为编写Python扩展模块而设计的语言.它旨在弥合优秀的,高级的,易于使用的Python世界与凌乱的低级别C世界之间的差距.

  • Cython是Pyrex更广泛使用,更积极开发的友好型叉子. (3认同)

bca*_*tle 14

Nuitka是一个Python到C++编译器,它链接到libpython.这似乎是一个相对较新的项目.作者声称在pystone基准测试中CPython 的速度有所提高.


Con*_*lls 10

Pyrex是Python语言的一个子集,它编译为C语言,由最初为Python 构建列表推导的人完成.它主要是为构建包装器而开发的,但可以在更一般的环境中使用. Cython是一个更积极维护的派雷克斯叉.

  • Cython是Pyrex更广泛使用,更积极开发的友好型叉子. (2认同)

Gre*_*ill 9

这似乎是合理的第一眼,但是也有很多的Python中普通的东西没有直接可映射到一个C表示没有带过很多Python运行时支持.例如,想到鸭子打字.Python中用于读取输入的许多函数可以采用文件或类文件对象,只要它支持某些操作,例如.read()或readline().如果你仔细想想怎样才能映射这种类型到C的支持,你就开始正是想象各种各样的事情,Python运行时系统已经做.

有一些实用程序,如py2exe,它将Python程序和运行时捆绑到一个可执行文件中(尽可能).


ser*_*lle 5

一些额外的参考: