为什么Python比Java慢但比PHP快[关闭]


17

我已经多次看过各种基准测试,这些基准测试表明一堆语言如何执行给定任务。

这些基准测试始终表明Python比Java慢,比PHP快,我不知道为什么会这样。

  • Java,Python和PHP在虚拟机中运行
  • 所有这三种语言都将其程序转换为可在操作系统之上运行的自定义字节码-因此,没有一种语言可在本地运行
  • Java和Python都可以“编译”(.pyc对于Python),但Python的__main__模块未编译

Python和PHP是动态类型的,而Java是静态类型的-这就是Java速度更快的原因,如果是,请说明这如何影响速度。

而且,即使dynamic-vs-static参数正确,也不能解释为什么PHP比Python慢​​-因为两者都是动态语言。

你可以看到一些基准这里这里,并在这里


关于Python与PHP:最有可能只是实现质量问题。
查尔斯·萨尔维亚

8
@good_computer大多数基准测试都做得很糟糕。最近又有一个(我不认为您已经链接了),大多数评论过它的人都抱怨说它声称“最快”的语言只是具有最佳的优化代码。通常,这是由不熟悉最终被认为是“慢速”语言的人在不知不觉中完成的,因此他们没有意识到自己正在用“快速”的语言编写更好的代码。
2012年

@good_computer在我看来,您正在声明某些内容,因为您的问题包括文本“ 始终这些基准表明,Python比Java慢,比PHP快 ”和“ PHP比Python慢 ”。删除这些引号并将其改写为与语言无关的问题可能会使它重新打开。
Briddums 2012年

这个问题的确存在偏见:(1)指的是由新手程序员使用他们不掌握的语言(在各自的注释线程中进行了剖析)对天真,未经优化的代码进行的非权威性基准测试;(2)基于误解关于解释/字节码语言解释了php / python,java的字节编码,python缓存文件是抽象语法树,而不是字节码)和三种语言的状态(python和php都有编译版本-python的版本更加成熟,已编译php,但是运行facebook)
ZJR 2012年

Answers:


26

使用简单(快速)的即席编译器,可以高效地JIT编译JVM代码。但是,由于它们具有动态类型的性质,因此对于PHP和Python而言,这同样会异常困难。JVM转换为相当低级的,直接的本机代码,与C ++编译器产生的代码非常相似,但是对于动态语言,您必须为所有基本操作和所有方法调用生成动态分配。这种动态调度是所有此类语言的主要瓶颈。

在某些情况下,可以使用更加复杂的跟踪JIT编译器来消除动态调度(以及Java中的虚拟调用)。这种方法仍处于起步阶段,没有做过多的抽象解释,并且这样的编译器很可能会阻塞eval调用(对于动态语言而言这是非常典型的)。

至于Python和PHP之间的区别,后者的质量要低得多。理论上它可以运行得更快,但是永远不会。


1
为什么JIT对于动态语言“异常”困难?看一下JavaScript世界中的v8或TraceMonkey - JIT可以正常工作。
treecoder

6
@good_computer,跟踪JIT明显比普通的即席JIT复杂,对于静态类型的语言,它们的性能仍然比JIT慢得多。适当的跟踪JIT将涉及全面的抽象解释,并且会阻塞每个eval调用。
SK-logic

2
有一百元左右甲骨文的HotSpot编译器团队里的工程师,将不同意关于“琐碎”的一部分:-)大概
约尔格W¯¯米塔格

1
@JörgWMittag当然,HotSpot并不是那么简单,它进行了一些静态分析,它使用了运行时分析结果,但它仍然比正确的跟踪JIT简单得多。而且,我要说的是,HotSpot过于复杂,从礼貌地说,它的实现有点太冗长。
SK-logic

1
@Frank Shearar,一种针对动态语言的临时JIT与针对静态类型的JIT一样简单(例如,请参见LuaJIT)。OTOH,高效的JIT是完全不同的东西。
SK-logic

21

这个问题有一个普遍的问题,那就是它太绝对了。说“语言X比语言Y快”实际上没有任何意义。计算机语言本身不是“快速”或“慢速”的,因为它仅仅是表达算法的一种方式。实际的问题应该是“对于这个特定的问题域,为什么语言X的实现X1比语言Y的实现Y1快?”的顺序。

由于某些语言比其他语言更容易实现某些领域,因此某些速度差异肯定会从语言本身中消失。但是,使实现快速的很多因素并不是语言。例如,如果不考虑要谈论CPython,IronPython还是PyPy,就不能说“ Python比Java慢”。对于使用VM的语言来说尤其如此,因为速度将直接受VM的质量影响。

顺便说一句,由于某种原因,我使用的系统无法在我们的设备上使用通常支持JIT的非常流行的JavaScript VM来使用它。这意味着我们的JavaScript的运行速度远远慢于具有类似处理器的PC上的运行速度。这项与语言本身没有直接关系的更改使JavaScript从“比C ++慢几倍”变为“比C ++慢几个数量级”。

还应考虑的是,语言在性能特征上的差异是无法直接比较的。太多的基准测试只是将程序从语言A转换为语言B,而没有考虑到语言在快速功能方面的差异。(您可以在任何合理的基准比较中看到它,例如您链接到的那些,因为它们经常有诸如“感谢某某某人向我展示如何用Foo语言实现它的注释”。)

例如,使用以下Java代码:

for(int i=0;i<10;i++) {
    Object o = new Object;
    doSomething(o);
}

在C ++中“重写”并比较运行时间将很诱人:

for(int i=0;i<10;i++) {
    Object *o = new Object;
    doSomething(o);
    delete(o);
}

事实是,任何有能力的C ++程序员都会立即看到在C ++中,这不是最快的方法。您可以通过将其更改为更适合C ++的方式轻松加快速度:

for(int i=0;i<10;i++) {
    Object o;
    doSomething(&o);
}

关键不是C ++可以快,而是写基准来比较语言确实非常困难。为此,您必须是两种语言的专家,并从头开始用两种语言编写。即使这样,您也可以轻松地进入一种语言在特定任务上表现出色的领域。例如,我可以用C ++写一个河内塔的版本,在任何合理的编译器上,它的运行速度都比Java快。我可以通过使用C ++模板作弊,在编译时进行评估来做到这一点(http://forums.devshed.com/c-programming-42/c-towers-of-hanoi-using-templates-424148.html)

并不是说我可以说“ C ++比Java快”,是因为我的程序在Java版本运行了几分钟后立即返回了(希望没人注意到我的程序花了半个小时来构建)。在各种情况下,C ++都更快。对于其他狭窄情况,可能是相反的情况。因此,它不是“ C ++更快”,而是“在可以使用模板在构建时评估表达式的实例中,C ++更快。” 不太令人满意,但真实。

语言的速度差异主要与实现方式有关。编译语言将比解释语言更快。编译为本地代码比编译为字节代码要快。这比诸如是否静态键入语言之类的问题具有更大的作用。当然,好的实现将比坏的实现更快。

并且不要忘记,优秀的程序员将比劣质的程序员产生更快的代码,通常程度要远远超过语言差异。


6

它与编译器的质量有关,对Java的编译器的优化持续了更长的时间,而优化则更为重要,因为所有代码都是针对Java编译的。我不确定python比PHP更快的确切原因,但是我敢打赌,这是因为Google对Python的影响。


8
为什么这被否决?这正是答案:表现为纯粹研究和工程工作的问题,并因此最终的钱。生产Java实现的公司恰好比生产Python或PHP实现的公司更丰富。就这样。
约尔格W¯¯米塔格

1
此外,我非常确定,如果CPython优化会使代码难以阅读,并且只会使性能提高很少,则不会被接受。
cgt

2
+JörgW Mittag:我不同意。某些语言功能可能很难以高性能实现,因此它们使有效实现的创建非常困难或几乎不可能。另一方面,创建“汇编程序”语言的“有效”实现非常容易。
user281377

@ammoQ我怀疑很多原因归结于类型系统,尤其是准确知道您拥有的类型以及允许的操作的确切语义的能力。动态语言从其本质上获得了灵活性,但使类型证明(因此难以编译为安全的超快速代码)变得更加困难。
Donal Fellows

1
@DonalFellows正是我的想法。在编译时知道的越少,在运行时必须弄清楚的更多。
user281377 2012年

4

为什么Java是最快的:

静态类型+ JIT编译+ --server标志可主动重新编译运行中的代码。

为什么Python比PHP更快:

Python可能是一种动态语言,但是它仍然是强类型的。这意味着您编码的结构能够进行运行时优化。

为什么PHP很烂:

它基本上是服务器上的javascript(不支持多线程,完全动态,松散类型)。

本质上,编译器对您的代码了解得越多,它就越可以优化。Java在运行之前和运行期间都可以完全优化。Python在运行时是可优化的,而PHP则非常糟糕。Facebook实际上在将PHP移植到服务器之前将其PHP转换为C。
https://developers.facebook.com/blog/post/2010/02/02/hiphop-for-php--move-fast/


实际上服务器上的javascript是Node.JS,据我了解(尽管我不会证实这一点),V8引擎总体上胜过PHP(尽管可能不多)。此外,您应该提到可以将Python编译为本机(与Java相比,它的性能如何?)
Jimmy Hoffa 2012年

我没有足够广泛地使用python来为您提供帮助,但是我可以说运行V8的nodejs支持本机C扩展(尽管跨JS / C边界据说很慢),而且它可以利用Google的JIT编译器。 ..如果node比python和php都快,我不会感到惊讶。这是一个基准测试(有很多缺陷)blog.famzah.net/2010/07/01/… 请注意,在评论者指出基准测试中的缺陷之前,java看上去比JS慢。盐。:)
Ajax

也就是说,node和php也是单线程的,除非您喜欢设置集群代理(例如haproxy),否则在严肃的生产环境中我不会碰到它们中的任何一个。
Ajax

1

基准测试偏向于采用繁重的数学编程。

如果考虑一下Python的首次编写的地点和原因,Python擅长于复杂的数学就不足为奇了。

另一方面,PHP是为服务网页而编写的,它可以做其他事情,但是网页在此任务上是最擅长的,并且与Java 相当或更好

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.