由Guido van Rossum于1991年创建的Python,如今已是发展最快、使用最广的编程语言之一。它可以在诸如:Web应用、桌面开发、机器学习、人工智能、数据分析、以及数据可视化等领域,得到广泛的使用。
值得注意的是,近年来,随着Python生态系统的不断发展壮大,业界出现了许多代码库、框架、以及编译器,可用来加速Python,克服其应用限制,甚至能够将Python与其他编程语言(如:Java、C、C++、JavaScript 等)协同使用。本文将向您介绍十种可用于将Python代码,按需编译为指定输出格式,以充分释放Python代码潜能的优秀编译器。
总的说来,目前由官方提供的、使用最广泛的当属CPython。当我们从官网处下载并使用Python时,CPython就是默认的编译处理器。当然,在不同的领域和需求场景中,开发人员还会用到Jython、Brython、PyPy、Skulpt、IronPython、PyJs、Nuitka、WinPython等编译器。
CPython
作为Python的原配编译器,CPython是Python语言规范的参考实现。因此,它往往能够最先获得Python语言的所有最新、最强的功能。顾名思义,它是由纯粹的C语言编写而成。当然,您不但可以从Python代码中调用C源代码的函数,还可以直接在Python中使用大量现有的C代码库。
值得注意的是,由于CPython在运行时解释的是字节码(bytecode),因此它在每个进程上都会使用全局解释器锁 (global interpreter lock,GIL),以确保在同一时刻,只有一个线程正在解释字节码。
当我们调用CPython时,那些在.py文件中编写好的源代码,首先会被自动编译成包含了Python字节码的.pyc文件,然后在经由PVM(Python虚拟机)进行解释。可见,CPython其实是编译器和解释器的结合,而不像C语言那样,可以直接将源代码,编译成为带有CPU指令的二进制机器码。
对于所有学生和初学者而言,CPython可以作为您开始Python编程之旅的第一步。当然,他们也可以使用其他编译器,让不同的编程语言与Python混合使用,去实现更多的特定开发需求。例如,下文将提到的Jython,会混合Java和Python代码,利用现有的Java和Python库,将代码转换为Java字节码,以实现在JVM上运行Python。
Brython
作为JavaScript的“替代品”,Brython可用于在浏览器中运行包含了Python 3脚本的Web应用。也就是说,开发者只需要在那些运行着Python脚本的网页上,包含brython.js即可。此处的brython.js是一种能够在页面上查找Python脚本,并通过Python代码,以执行JavaScript各项操作的引擎。
Python
-
"text/javascript"src="https://cdn.jsdelivr.net/npm/brython@3.8.10/brython.min.js"> "text/python">Pythoncodehere
上面的代码段展示了,在包含了brython.js之后,您可以使用脚本类型text/python,来添加Python脚本,并通过Python代码,像JavaScript那样去操作 DOM。
同时,您还可以进行Ajax的各种调用,并访问本地的文件系统。当然,您也可以在基于Brython的Python脚本中,包含各种现有的JavaScript库和框架,其中包括: Highcharts、vue.js、以及three.js等。
PyPy Python
虽然CPython是在Python中使用最广泛的编译器,但它并不是最快的一种。能够支持Python 2和Python 3核心语言规范的PyPy,可以替代默认的Python实现。
在CPython中,字节码在运行时被解释,因此性能有所下降。而PyPy采用的是即时(just-in-time,JIT)的编译概念。它在代码执行之前,就直接编译为机器代码,因此其执行速度提高了接近4倍。
值得注意的是,Python代码需要执行大量耗时处理的进程时,PyPy的速度优势会比较明显。而对于耗时较短的进程,JIT编译器本身则可能消耗更多的时间,并抵消整体的速度优势。
Jython或JPython
作为使用率第二高的一种Python实现,Jython最初被称为JPython。它是通过Python语言来实现Java虚拟机的。
开发者既可以将现有的Java包和代码库,导入自己的Python程序中,又可以在Java程序中嵌入Python脚本。无论是哪种方式,Jython编译器都会将带有Java和Python的整体代码组合,并编译成为可以在JVM上运行的字节码。
正是由于运行在JVM上,因此您可以在诸如:Windows、Linux、macOS、FreeBSD、以及Solaris等,几乎所有的平台上创建Jython项目。
Cython
Cython与CPython不同,它更像是一个超集,允许开发者在代码中结合C和Python,从而生成C语言代码类型的输出,以供任何一种C/C++编译器进行后续编译。
可以说,Cython兼顾了C语言的速度、Python的灵活性,并且可以作为用Python编写C扩展的强大工具。下面是有关Cython的重要说明:
- 开发者可以在Python代码中使用静态类型的声明
- 可以调试使用由Cython、Python和C编写的混合源代码
- 可以使用现有库(如:NumPy、SciPy、以及CPython生态系统中的其他库),去构建高性能的应用
如果说使用CPython可以为您提供解释字节码的速度,那么使用Cython则能够为您提供预编译为机器原生代码的速度。
Skulpt
Skulpt是由Graham Scott创建的一个实验项目,其流行的速度非常快。作为Python在浏览器内的一种实现,Skulpt的主要目的是提供一种良好的在线式Python编译器。当然它也可以通过让Web应用引擎包含Skulpt,以方便开发者编写出被用于前端的Python脚本。
值得一提的是,Skulpt会先将Python代码转换为JavaScript,然后在浏览器中执行相应的代码。
Nuitka
由Kay Hayen开发和维护的Nuitka,是另一个用Python编写的编译器。虽然仍处于反复迭代之中,但它已经对默认的CPython实现进行了运行时(run-time)上的改进。
目前,Nuitka的工作原理是将Python代码编译为C语言代码,并利用libPython进行最终执行。当然,Nuitka的最终计划是将其替换为原始的纯C语言的数据类型,而不必再去借用libpython。
注意,Nuitka可以在Apache的许可证下免费被使用,并且可以在Linux、Windows、macOS、以及其他平台上被设置使用。
IronPython
于2006年首发的IronPython,是.NET框架的Python实现。它支持.NET core和.NET Standard,可以运行在Windows、macOS和Linux平台上。IronPython之于.NET Framework,就像Jython之于Java。
借助IronPython,开发者可以使用所有的Python库、.NET Framework、以及.NET支持的所有语言(如C#)。正是由于IronPython是用C #编写的,因此如果您具有.NET的背景,则可以使用Python扩展工具,轻松地为Python设置VS代码。当然,您可以根据Apache许可证,免费使用该编译器。
PyJS
PyJS是另一款完全用Python,而非JavaScript或HTML去开发Web应用的编译工具。在后台,PyJS会在使用内置的Ajax框架之前,将Python代码编译为JavaScript。
同时,PyJS带有一个桌面版本,以便您能够在桌面上运行被开发应用的,功能相对应的Web版本。
WinPython
WinPython是Python的“即用型”发行版。也就是说,用户无需任何安装,即可在Windows PC上运行。作为另一种Python的实现,WinPython编译器不仅带来了Python执行环境,而且还包含了诸如:Scipy、Numpy、以及Pandas等各种Python库。
WinPython的特点在于,它既是面向数据科学家的全功能性科学环境,又是面向学生和初学者的便捷工具。
Transcrypt
Transcrypt更像是一个从Python到JavaScript的转换器。也就是说,您可以使用Transcrypt将自己的Python代码转换为JavaScript。据此,您可以在Web应用或Node.js服务器中,使用已编译的代码,作为服务器端的应用程序。
通常,Transcrypt会生成可读的JavaScript,您可以使用源映射(source maps)和Python源代码,对其进行调试。同时,您还可以从该工具中获得minifier、静态类型验证器、以及带有Typescript的linter。
小结
上述介绍的十种编译器,大多能够使开发人员在自己的项目中混合、或匹配多种语言。当然,您也可以从如下方面,去选择恰当的Python编译器:
- 需要利用其他编程语言的现有代码库。
- 缺乏Java、JavaScript、C、甚至Python中某一方面的技能。
- 需加速执行Python的运行时。
原文标题:The 10 Best Python Compilers for Developers ,作者: Sophia Rodriguez
【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】
原文链接:https://developer.51cto.com/art/202109/681403.htm