选择一个解释器

Python的现状 (2 vs 3)

当选择Python解释器的时候,一个首先要面对的问题是:“我应该选择Python 2还是Python 3?” 答案并不像人们想象的那么明显。

现状的基本要点如下:

  1. Python 2.7 作为标准有 很长 一段时间了。
  2. Python 3 将重大改变引入到语言中,其中有不少开发者并不满意。
  3. Python 2.7 直到2020前都会得到必要的安全更新 [1]
  4. Python 3 正在不断发展,就像Python 2在过去几年一样。

所以,你现在可以看到为什么这不是一个简单的决定了。

建议

那我直言不讳:

使用Python 3,如果:

  • 你不在乎。
  • 你喜欢Python 3。
  • 你并不关心Python2 和 3 的比较。
  • 你不知道该用哪个。
  • 你拥抱变化。

使用Python 2,如果:

  • 你热爱Python 2,并对未来的Python 3感到悲伤。
  • 一门语言及它的运行时永不改变,有助改善你的软件对稳定性的要求。
  • 你依赖的软件需要它。

所以.... 3?

如果你想选择一种Python的解释器,你又不是固执己见的人,我推荐你用最新的Python 3.x, 因为每个版本都带来了新的改进了的标准库模块、安全性以及bug修复。进步就是进步。

鉴于此,如果你有一个强有力的理由只用Python 2,比如Python 3 没有足够能替代的Python 2 的特有库,或者你(像我)非常喜而且受Python 2启发。

查看 Can I Use Python 3? 来看看是否有你 依赖的软件阻止你用Python 3。

延伸阅读

能够同时兼容Python 2.6,2.7,和Python 3的代码 是可能的。这包括从简单到困难的各种难度,取决于你所写软件的类型;如果你是初学者,其实有更重要的东西要操心。

实现

当人们谈论起 Python,他们不仅是在说语言本身,还包括其CPython实现。 Python 实际上是一个可以用许多不同的方式来实现的语言规范。

CPython

CPython 是Python的参考实现,用C编写。它把Python代码编译成 中间态的字节码,然后由虚拟机解释。CPython为Python包和C扩展模块提供了最大限度的兼容。

如果你正在写开源的Python代码,并希望有尽可能广泛的用户,用CPython是最好的。使用依赖C扩展的包,CPython是你唯一的选择。

所有版本的Python语言都用C实现,因为CPython是参考实现。

PyPy

PyPy 是用RPython实现的解释器。RPython是Python的子集, 具有静态类型。这个解释器的特点是即时编译,支持多重后端(C, CLI, JVM)。

PyPy旨在提高性能,同时保持最大兼容性(参考CPython的实现)。

如果你正在寻找提高你的Python代码性能的方法,值得试一试PyPy。在一套的基准测试下, 它目前比CPython的速度快超过5倍 。

PyPy支持Python 2.7。PyPy3 [2],发布的Beta版,支持Python 3。

Jython

Jython 是一个将Python代码编译成Java字节码的实现, 运行在JVM (Java Virtual Machine) 上。另外,它可以像是用Python模块一样,导入 并使用任何Java类。

如果你需要与现有的Java代码库对接或者基于其他原因需要为JVM编写Python代码,那么 Jython是最好的选择。

Jython现在支持到Python 2.7 [3]

IronPython

IronPython 是一个针对 .NET 框架的Python实现。它 可以用Python和.NET framework的库,也能将Python代码暴露给给.NET框架中的其他语言。

Python Tools for Visual Studio 直接集成了 IronPython到Visual Studio开发环境中,使之成为Windows开发者的理想选择。

IronPython支持Python 2.7 [4]

PythonNet

Python for .NET 是一个近乎无缝集成的, 提供给本机已安装的Python .NET公共语言运行时(CLR)包。它采取与IronPython (见上文)相反的方法,与其说是竞争,不如说是互补。

PythonNet与Mono相结合使用,通过.NET框架,能使Python在非windows系统上(如OS X和Linux)完成操作。它可以在除外IronPython的环境中无冲突运行。

PythonNet支持Python 2.3到2.7 [5]

[1]https://www.python.org/dev/peps/pep-0373/#id2
[2]http://pypy.org/compat.html
[3]https://hg.python.org/jython/file/412a8f9445f7/NEWS
[4]http://ironpython.codeplex.com/releases/view/81726
[5]http://pythonnet.github.io/readme.html