Python解释器的平铺直叙
前言:
解释器就是帮助我们将Python代码文件,交给机器可以执行的工具。
解释型:
通常来讲将Python和Java归为解释型语言
- 用户提交源码;
- 解释器将源码转化为字节码,在Python中一般为.pyc文件,这个字节码机器不能执行的;
- 如果要执行字节码,则虚拟机上场了,这里需要强调一下,这个虚拟机不是vmware或者virtualbox的虚拟机概念,在Python中由虚拟机来执行这些字节码,由于2中的字节码一般是不依赖于操作系统的,所以可以做到跨平台运行,也就是跨平台这件事,有虚拟机来搞定了
Python中的几种解释器:
CPython
CPython是标准Python,也是其他Python编译器的参考实现。通常提到“Python”一词,都是指CPython。CPython由C编写,将Python源码编译成CPython字节码,由虚拟机解释执行。没有用到JIT等技术,垃圾回收方面采用的是引用计数。
Note:JIT是一种提高程序运行效率的方法。通常,程序有两种运行方式:静态编译与动态解释。静态编译的程序在执行前全部被翻译为机器码,而动态解释执行的则是一句一句边运行边翻译。
Jython
Jython在JVM上实现的Python,由Java编写。Jython将Python源码编译成JVM字节码,由JVM执行对应的字节码。因此能很好的与JVM集成,比如利用JVM的垃圾回收和JIT,直接导入并调用JVM上其他语言编写的库和函数。
IronPython
IronPython与Jython类似,所不同的是IronPython在CLR上实现了Python,即面向.NET平台,由C#编写。IronPython将源码编译成TODO CLR,同样能很好的与.NET平台集成。即与Jython相同,可以利用.NET框架的JIT、垃圾回收等功能,能导入并调用.NET上其他语言编写的库和函数。IronPython默认使用Unicode字符串。
PyPy
这里说的PyPy是指使用RPython实现,利用Tracing JIT技术实现的Python,而不是RPython工具链。PyPy可以选择多种垃圾回收方式,如标记清除、标记压缩、分代等。相对于CPython,PyPy的性能提升非常明显,但对第三方模块的支持不够。比如无法很好的支持使用CPython的C API编写的扩展。
Python优化
一般来说,受限于语言的特性,相比与Java,Python属于动态数据类型,也就是说存在于内存中的数据,并不是像Java那样一开始就是与类型强绑定的,这样也要求Python中的虚拟机要进行数据类型检查,也就消耗了性能。
优化的方式很多,可以考虑通过Cython来进行优化,来提升到接近C的性能。