当谈到python时,一般指的是cpython。但python实际上是一门语言规范,只是定义了python这门语言应该具备哪些语言要素,应当能完成什么样的任务。这种语言规范可以用不同的方式实现,可以用c实现,也可以用c++、java、c#、javascript,甚至使用python自己实现。这篇文章就是简要介绍并比较不同的python实现,并且今后还会不断的扩充。
cpython
cpython是标准python,也是其他python编译器的参考实现。通常提到“python”一词,都是指cpython。cpython由c编写,将python源码编译成cpython字节码,由虚拟机解释执行。没有用到jit等技术,垃圾回收方面采用的是引用计数。
所以当有人问道python是解释执行还是编译执行,可以这样回答:python(cpython)将python源码编译成cpython字节码,再由虚拟机解释执行这些字节码。
如果需要广泛用到c编写的第三方扩展,或让大多数用户都能直接使用你的python代码,那么还是使用cpython吧。
jython
jython在jvm上实现的python,由java编写。jython将python源码编译成jvm字节码,由jvm执行对应的字节码。因此能很好的与jvm集成,比如利用jvm的垃圾回收和jit,直接导入并调用jvm上其他语言编写的库和函数。
对于想在jvm上使用python简化工作流程,或者出于某些原因需要在python语言中使用java的相关代码,同时无需用到太多cpython扩展的用户来说,极力推荐jython。
ironpython
ironpython与jython类似,所不同的是ironpython在clr上实现了python,即面向.net平台,由c#编写。ironpython将源码编译成todo clr,同样能很好的与.net平台集成。即与jython相同,可以利用.net框架的jit、垃圾回收等功能,能导入并调用.net上其他语言编写的库和函数。ironpython默认使用unicode字符串。
另外,python tools for visual studio可以将cpython和ironpython无缝集成进vs中。如果仅需要在windows上开发较大的python项目。条件允许的情况下,ironpython是个不错的选择。
pypy
这里说的pypy是指使用rpython实现,利用tracing jit技术实现的python,而不是rpython工具链。pypy可以选择多种垃圾回收方式,如标记清除、标记压缩、分代等。
想对于cpython,pypy的性能提升非常明显,但对第三方模块的支持真心是弱爆了。比如无法很好的支持使用cpython的c api编写的扩展,完全不支持使用swig、sip等工具编写的扩展。就连numpy,也要在编译器的层面上从头实现。即使实现了,也只能在python层面中使用,无法供其他第三方模块在非python环境中使用。关于pypy,后续会尝试用一篇完整的文章来介绍。不过我的这一篇文章中对pypy和下面的pyston有更详细的描述。
pyston
pyston由dropbox开发,使用c++11编写,采用method-at-a-time-jit和mark sweep——stop the world的gc技术。pyston使用类似javascript v8那样的多层编译,其中也用到了llvm来优化代码。pyston正在发展中,还不成熟。但其前景是非常值得看好的(如果没像google的unladen swallow那样死掉的话。话说,google的东西现在是越来越不敢用了,不是他们的东西不好,是怕用着用着,他们就关掉了)。
总结
这里介绍了主要(其实是我接触过的,^_^)的几款python实现,这几款python实现可以满足大部分需要。而略过了几款,如cython、brython、rubypython等。其实cython还是挺有用的,不过现在接触的不多,不敢多写,看后面能不能抽时间补上。而brython、rubypython,个人感觉完全可以用js或ruby,没必要在一种动态语言的环境中再使用另一种动态语言。
Powercast为尼吉康新型小型钛酸锂 (LTO) 可充电电池配备射频充电功能
RJ45连接器专用贴片电容 网络连接器专用贴片电容
国产源表的优势和应用前景分析:联讯仪器参数对比
汽车智能化变革下,座舱如何重新定义?
其它品牌手机电池鉴别
python的各种实现有何优劣
英伟达重启中国“特供版”AI芯片出货,性能缩水80%左右
华硕灵耀魔方Mesh支持Mesh 2.0 兼容各大芯片平台
ALBANY卷帘门的调试心得V1版
小米Note3开箱简评:骁龙660成中端标配 雷军目的欲打造爆款街机
华为主推Polar码,中兴小米为啥出了那么大力?
MiniARM工控板构建环境数据监控系统
图解Java多线程中的wait()和notify()方法
自复式过欠压保护器出现过压时该如何工作
基于排行榜功能使用redis中的有序集合实现
小米5C再曝光,还是小米自主松果处理器,和4.6小屏旗舰
国产高精度ADC可100%兼容AD7792用于应变计传感器
分享一个限流恒流电路
国产手机品牌占据缅甸市场大半江山
中国移动启动6省固网业务或将赶超中国电信?