关于速度:Python VS Java

时间:2010-12-30 02:43:24

标签: java python

对Python和Java的速度感到好奇.. 直觉上,Python应该比java慢得多,但我想知道更多......有人能给我更多吗?或者介绍一些不错的帖子来阅读?

4 个答案:

答案 0 :(得分:13)

Python的当前标准实现(CPython)比Java慢,因为标准的CPython实现没有强大的JIT compiler。爱好。

有几个项目旨在生成更快的Python实现:

根据我的尝试,其中一些项目可以为特定算法提供非常好的加速,但是对于典型的应用程序代码,您仍然无法像Java那样快速运行。目前的大部分努力似乎都是针对PyPy的。

答案 1 :(得分:10)

缺少提到的JIT是一个原因,但另一个原因是Python是动态的。是的,这确实使语言变慢。您可以使用Cython自己查看。

用Python编写的函数通常可以使用Cython编译为C.它使它更快。但是当你开始向变量和参数添加类型信息时,它会变得非常快,因为Cython和C编译器都可以开始应用各种简单的优化,当类型是动态的时,你不能这样做。

因此,差异的一部分是Python的内在动态。

关于未来:Python 3有函数注释:http://www.python.org/dev/peps/pep-3107/我希望在几年之后,像PyPy和UnladenSwallow这样的JIT编译器将使用这些信息,你会看到Python同样快作为Java,并且通过一些谨慎应用Cython,甚至更快。 :)

答案 2 :(得分:2)

我没有数据要点,但有一个有趣的方面是JVM上有Python实现(同样适用于许多其他动态/脚本语言) - 例如JPython和Jython。这可能允许一些Python应用程序以与本机Java应用程序相当的速度运行,假设Python运行时本身(在JVM上)的实现是有效的。

答案 3 :(得分:0)

关于为什么 Java 比 Python 快,这里有很多很好的答案,最常见的 2 个答案是 Python 是动态类型的,并且 Java 有几个非常强大的即时编译器(2 个生产质量,几个实验而不是一般用途)在它的武器库中,只有 C# 公共语言运行时能够匹配它。这是真的,但即便如此,Java 仍然更快的原因还有最后一个原因,而且奇怪的是,这与 Java 的解释器与 Python 的解释器在设计方式上的差异有关。

现在,这是 OpenJDK/HotSpot JVM 生产中解释器的源代码,Java 的参考实现(JVM 源代码中实际上还有另一个遗留解释器,它是由 James Gosling 自己编写的旧解释器当 Java 最初被创建时,但那个已经过时并且没有编译成实际的二进制文件,除非您从源代码编译它并出于调试目的使用特殊标志。有趣的是,这是负责为 Java 赢得“慢得可怕”声誉的解释器那些天): https://github.com/openjdk/jdk/blob/master/src/hotspot/share/interpreter/templateInterpreter.cpp

相比之下,这是执行 Python 操作码的 CPython 解释器的代码段: https://github.com/python/cpython/blob/master/Python/ceval.c#L1847

注意到 2 之间有什么不同吗?

虽然 CPython 有一个巨大的 for 循环,每个可能的操作码都有一个 switch case(实际上,除了 Java 之外,几乎所有其他解释器都是如此),但没有一个循环,if else 或 switch case在 Java 的解释器中。这是为什么?

答案是 Java 的解释器是一种称为模板解释器的特殊类型,它是迄今为止唯一的一种。与大多数设计不同,Java 的解释器不是使用 switch 来评估 Java 字节码,而是有一个大的字节码数组,在应用程序启动时映射到本地机器语言。这样,Java Interpreter 就完全不需要对字节码求值,它只是将字节码作为数组索引插入,加载原生机器语言,直接在 CPU 上运行。这意味着 Java 的“解释器”实际上是一个折扣编译器,因为它直接在硬件上运行您的代码。另一方面,与当今许多其他解释器一样,CPython 是一种运行的工厂字节码解释器,它在软件中处理 Python 操作码。这显然使 Python 的运行速度比 Java 慢,即使没有 JIT。

至于为什么Java有如此独特的Interpreter设计,其他地方都没有使用,是因为它需要直接运行解释代码和JIT编译代码无缝对接,巧妙的设计让Interpreter包含一个字节码表->机器语言对而不是直接在软件中执行它是实现这一目标的最佳方式。