Python与其他语言比较
- Perl:脚本语言,优势在于字符串模糊匹配,远超标准shell脚本,拥有强大的正则表达式引擎。使Perl主要应用于过滤、识别和抽取字符串。之前一直是开发Web服务器CGI(Common Gateway Interface)网络程序的语言。Python的正则表达式很多程度参考了Perl。Perl语言晦涩,对符号过度依赖,学习曲线高。由于语法复杂,要完成相同的任务,实现方式有多种,引起程序员之间的分歧。具体内容可以参考下述网页。
https://pleac.sourceforge.net/pleac_python/
https://www.garshol.priv.no/download/text/perl.html
- Java:Java与Python都有类似的面向对象的语法及特性。Java尽管比C++简单得多,但依旧繁琐,但Java提供了更加快速炖大鹅开发环境。而Python更加简洁纯粹,但性能较Java略低。在Python和Java关系上,曾经有Jython这样一个产品。Jython是一个完全用Java开发的Python解释器,可以在JVM中运行Python程序。在Jython环境中,可以熟练的处理Java对象,Java还可以与Python对象进行交互,可以访问自己Javade标准类库,如同Java一直是Python环境中的一部分。不过Jython在2.7以后就停滞不前,Python3.*的程序无法兼容。具体差异,参考下述网页。
https://dirtsimple.org/2004/12/python-is-not-java.html
- Ruby,由于Ruby on Rails曾经红极一时,Ruby也经常拿来与Python比较。Ruby完全面向对象,而Python有字节码解释器,Ruby没有。Python有多种编程范式混合,易读性更强。相对于Rails,Python也有自己的Web应用框架,Django、Turbogears等。
- Tcl,是一种曾经与Python可以相提并论的脚本语言。Tcl是最易于使用的脚本语言之一,程序员可以像访问系统调用一样对Tcl语言进行扩展。不过,它有更多的局限性,如:有限的数据类型;没有类、模块、包机制;通常需要与它的图形工具Tk一起工作。Python则有丰富的数据类型;有类、模块、包机制可以编写大型程序;目前Tk已经一直到Python中(Tkinter)。
- Lisp,函数化编程语言,它的lambda、map、filter、reduce等机制,一直在被Python借鉴。Python虽然有一点点函数化编程(functional programming,FP)的结构,但并不是纯粹的函数化编程语言。
- JavaScript与Python相似的面向对象脚本语言。JavaScript是基于原型系统的,而Python则遵循传统的面向对象系统。
Python解释器的其他实现
- Jython:完全用Java写成。尽管与Python解释器存在细微差别,但两者还是比较接近,而且启动环境完全相同。Jython的优势如下:
- 只要有JVM,就能运行Jython;
- 拥有访问Java包与类库的能力;
- 为Java开发环境提供脚本引擎;
- 能够很容易的测试Java类库;
- 提供访问Java原生异常处理能力;
- 继承了JavaBeans特性和内省能力;
- 鼓励Python到Java或Java到Python的开发;
- GUI开发人员可以通过AWT/Swing库;
- 利用Java GC原生垃圾收集器。
由于Jython的开发者被微软挖去做IronPython,导致Jython开始没落,至Jython2.7之后就没有再进行过更新。
- py4j,作为Jython替代,Java 程序中调用 Python 函数,并且在 Python 程序中访问 Java 对象。Py4J 是一个 Java 库和 Python 模块。它可以被用于构建混合语言应用程序、数据科学项目,以及其他需要结合 Java 和 Python 的场景。具有如下特点:
- 易用性:Py4J 提供了简单的 Java API 和 Python API,使得在 Java 和 Python 之间进行交互变得非常容易。
- 高性能:由于 Py4J 是基于 Java 实现的,因此它的性能表现通常会优于其他 Python-Java 框架。
- 安全性:Py4J 支持安全模式,可以在不信任的环境中运行 Python 代码。
- 广泛的适用性:Py4J 可以在各种操作系统和 JVM 上运行,并且支持多种 Java 版本。
- IronPython,用C#语言实现,适用于.NET和Mono。可以在.NET应用程序正好IronPython解释器来访问.NET对象。IronPython的扩展可以用C#或VB.NET编写。另外还有一种名为Boo的.NET、Mono语言。
- Stackless,解决CPython没改Python函数调用都会产生一个C函数调用,这样会限制函数调用,用户无法实现线程库和复杂递归应用。Stackless允许一个C栈帧可以拥有任意数量的Python栈帧。这样可以几乎无穷的进行函数调用,并支持巨大数量的线程。Stackless唯一的问题是它要对现有的CPython解释器做重大修改,所以它几乎是一个独立的分支。