Python比Java / C#慢吗?[关闭]


71

Python比Java / C#慢吗?

性能比较c-java-python-ruby-jython-jruby-groovy

这是一个优化CPython的项目:空载吞咽


1
你知道,你真的应该提供这一证据……
annakata

2
你为什么要关闭它,我不认为这是主观的或争论的。至少在问题上应该有这么多的灵活性!
真正的红色。

2
@annakata:有些数据表明Python可能很慢。它显然比C#慢。当涉及到Java时,这值得商bat。有很多JIT因素会影响这一点。
S.Lott

11
guido有时说:python专注于快速开发-而不是快速运行时。您应该能够尽可能简单和快速地对skripts进行编码。
Michael Piendl 09年

6
进攻?!为什么有人将这个问题标记为令人反感?
vartec

Answers:


126

不要混淆语言和运行时。

Python(该语言)具有许多运行时实现。

  • CPython通常是解释型的,并且会比本机代码C#慢。取决于Java JIT编译器,它可能比Java慢。

  • JYthon在JVM中进行解释,并且具有与Java相同的性能配置文件。

  • IronPython与C#依赖于相同的.NET库和IL,因此性能差异将相对较小。

  • 可以通过PyREX,PyToC等将Python转换为本地代码。在这种情况下,它通常会和C ++一样好。您可以-在某种程度上-进一步优化C ++,并可能比未优化的PyREX输出更好的性能。

    有关更多信息,请参见http://arcriley.blogspot.com/2009/03/so-long-pyrex.html

请注意,Python(语言)并不慢。某些Python运行时(例如CPython)比本地代码C ++慢。


84
Jython根本没有与Java相同的性能配置文件。实际上,我在问题中提到的博客文章中对它进行了基准测试,它比Java慢很多。
Dhananjay Nene

8
除此之外,事实是Jython甚至没有远程拥有Java的性能概况。这是由于JVM还是语言,还是在JVM上的实现是另一回事。在我看来,后者似乎是后者,尤其是因为JRuby的性能似乎与Ruby的C实现相当。
Michael Borgwardt

4
@Michael Borgwardt:这是通常的罪魁祸首-但是不是Pythonic的“基准”是不能接受的比较。在进行比较以证明C比CPython更快之前,没有人试图将Python的所有动态内存管理添加到C程序中。
S.Lott

10
C#和IronPython几乎没有以相同的速度运行。这是预料之中的;Python是一种高级语言(IronPython编译器还不如C#成熟)
BlueRaja-Danny Pflughoeft 2010年

62
当然,不要将语言与运行时相混淆,也不要将随便表达的问题与其字面意义相混淆。当人们问这样的问题时,他们几乎总是表示,如果没有异常的努力或成本,最快的非深奥实现与典型的运行时环境(往往意味着相对较现代的Windows或Linux系统)相结合,对于典型的开发(“典型”取决于上下文,但通常与一般Enterprisey内容,脚本和/或Web开发有关,而一般开发人员很少与数字集成有关)?
user359996

63

问为什么Python比Java / C#慢是不正确的。Java有多快?好吧,天真的解释器比优化的编译器慢大约十倍。我相信有一个用JavaScript编写的Java字节码解释器-可能不是很快。因此,预期的问题似乎是“为什么CPython语言系统比等效的Sun,IBM和Oracle JRE和Microsoft .NET运行时要慢?”

我相信正确的答案是非技术性的。最快的Java和.NET运行时更快,因为它们拥有庞大的全职技术团队在性能竞争的环境中开发它们。

动态语言系统易于实现。任何白痴都可以做到。我有。静态语言系统的设计和实现更加复杂。一个简单的静态系统往往会比等效的动态工作系统快得多。但是,高度优化的动态系统有可能以几乎相同的速度运行。我了解一些Smalltalk实施非常好。经常引用的开发动态系统的示例是MIT Lisp Machine

另外,如果真正的苦恼是由库代码完成的,那么语言系统可能没关系。或者,该语言可能鼓励(或花时间(!))开发更有效的算法,从而可以轻松消除恒定因子性能差异。


39
我认为没有白痴可以做到。这需要一种非常特殊的白痴:)
马克·里奇曼

39

如其他答案中所述,这取决于运行时系统以及手头的任务。因此,标准(C)Python不一定比Java或C#慢。它的某些模块是用C实现的。因此可以将本机实现的速度与Python语言结合在一起。

我们做了一个小实验:我们比较了不同语言中阶乘计算的执行时间。该测试实际上旨在评估任意精度整数实现的性能。

受测者。语言任意精度整数运行时

     1. Java java.math.BigInteger JRE 6.13
     2. .NET System.Numerics.BigInteger MS CLR 4.0
     3. Python长的Active Python 2.6.2.2
     4.吱吱声BigInt吱吱声3.10.2
     5. .NET Mono.Math.BigInteger MS CLR 4.0

结果:

                 1)2)3)4)5)
   10.000!343毫秒137毫秒91毫秒1.200毫秒169毫秒
   20.000!1.480毫秒569毫秒372毫秒1.457毫秒701毫秒
   30.000!3.424毫秒1.243毫秒836毫秒3.360毫秒1.675毫秒
   40.000!6.340毫秒2.101毫秒1.975毫秒6.738毫秒3.042毫秒
   50.000!10.493毫秒3.763毫秒3.658毫秒10.019毫秒5.242毫秒
   60.000!15.586毫秒7.683毫秒5.788毫秒14.241毫秒10.000毫秒

替代文字http://www.mycsharp.de/wbb2/attachment.php?attachmentid=6909&sid=0d5aa62b522d005d9e7089785b5d19f1

条形图显示结果。Python无疑是赢家。据我所知,Python使用Karatsuba算法将大整数相乘,这说明了速度。

此外,Python的“任意精度整数”类型是内置的long。因此,您甚至不需要Java的BigInteger类所需的特殊类型处理。


1
那么这些比较呢?恕我直言,它们看起来比您更具说服力。shootout.alioth.debian.org/gp4/...shootout.alioth.debian.org/gp4/...
Özgür的

2
@Comptrol这些都是外的日期看这里- shootout.alioth.debian.org/u32q/...这里shootout.alioth.debian.org/u32q/...
igouy

1
考虑一下为什么那些非常聪明的Haskell实现者将其基准套件NoFib dcs.gla.ac.uk/fp/software/ghc/nofib.html
igouy 2010年

感谢您分享这些结果,对您有所帮助
a.boussema 2014年

@wierob 343 ms 137 ms 91 ms 1.200 ms 169 ms这些值是小数吗?0.343 0.137?
co2f2e

30

Simply- Python很慢

无论使用哪种解释器(当前可用),它都比Java和C慢。在各种基准测试中,它比Ruby和PHP慢。不要依赖他人的答案,请检查并验证自己。

http://benchmarksgame.alioth.debian.org/u64q/benchmark.php?test=all&lang=python3&lang2=java&data=u64q

我个人认为,在更快地获取python方面已经做出了许多认真的贡献和发展。由于python的生产率很高,并且可以直接解决一些问题,因此速度/性能并没有受到重视。也有一些架构问题阻止Python进行性能调整。

免责声明-此答案可能会伤害Python爱好者。我也是Python开发人员,喜欢用Django / Flask / Pyramid(而不是Spring(Java))开发Web应用程序。但是从我的工作和经验中,我实际上看到了Python变慢的速度。速度并不总是我的首要任务。但是我确实支持他们,他们说Python Interpreter应该加油和润滑,或者总的更换引擎,至少可以参加马拉松比赛。它是一种主流的编程语言。


12
开发人员时间更有价值。
Ali Gajani 2014年

您能否概括一下其中的一些架构问题?
oddRaven

2
明显的几个-GIL和单CPU限制。为了进行实验,请使用Tornado在Websocket(JSON有效负载)上创建实时消息传递服务器,然后尝试对可以处理多少个连接的消息基准进行基准测试。在Golang中编写相同的内容,并获得〜xNumCPU性能。从单进程扩展到多进程(在龙卷风python中)将在开发上迈出巨大的一步,但是当使用Golang甚至Java(除了嘈杂的Java库问题)完成时,这要好得多。我在这里所说的不是理论,而是实践中所面临的。
拉维·库玛

16

如评论中所建议,您确实应该提供一个测试用例进行推理。性能差异背后的原因将根据所执行的测试而改变。

但是,我建议静态与动态性质可能与它有很大关系。对于非虚拟调用,JIT编译的C#/ Java非常便宜,因为它可以在JIT时准确确定。甚至虚拟呼叫也只涉及一个重定向级别。当绑定变得动态时,需要考虑的范围更广。

我不了解有关Python的足够详细信息,无法声称自己了解其确切的运行时行为,我怀疑它的版本和实现也会有所不同。诸如“ python字节码”之类的东西然后由虚拟机执行-该虚拟机是否实际执行JIT编译是另一回事。



还有一个分支可以将Python移至llvm: code.google.com/p/unladen-swallow/wiki/ProjectPlan
贾森·贝克

14

归结为一个事实,即编译阶段需要处理的信息较少,因此在使用鸭子类型(动态类型)的语言时,运行时需要做更多的工作。

因此,如果我要对方法foo.bar()进行调用,则在Java或C ++的情况下,可以通过在编译过程中发现“ foo”的类型,然后在内存位置直接调用该方法来优化对bar的调用编译器知道将找到它。由于python或其他任何动态类型化的语言编译器都不知道对象foo属于哪种类型,因此它必须在运行时进行类型检查,然后查找bar方法的地址,然后调用它。

python编译器作者还面临其他困难,尽管上述希望可以充分说明这一点。因此,即使有最好的编译器编写器,静态类型的语言也可能在运行时表现更好。

动态类型语言得分通常在开发时间中。由于编写和维护的代码行较少,并且开发人员没有编译等待时间,因此开发过程通常要快得多。


2
“由于编写和维护的代码行减少了”-维护部分主要是花钱。随着项目的发展,您会发现修复python中的错误有多么困难。此外,如果人们要压缩东西,通常很难读懂python代码
Arunav Sanyal 2014年

9

您所得到的是使用Python编写Java的清晰示例:

 def __init__(self,size):  
     self.first = None  
     last = None  
     for i in range(size):  
         current = Person(i)  
         if self.first == None : self.first = current  
         if last != None :  
             last.next = current  
             current.prev = last  
         last = current  
     self.first.prev = last  
     last.next = self.first  

多一点pythonic:

 def __init__(self,size):  
     chain = [Person(i) for i in range(size)]
     self.first = chain[0]
     chain = zip(chain, chain[1:].append(chain[0]))
     for p,n in chain:
        p.next = n
        n.prev = p

8
除非您能提供证据或理由说明“ pythonic”版本的速度要快400倍左右,否则它是无关紧要的。
Michael Borgwardt 2009年

4
我认为有一点很重要,那就是所有挑剔的低级搅动都可能比直接的pythonic方法慢。但是后者有一个错误-.append()返回None;vartec可能意味着chain [1:] + chain [:1]。
Alex Martelli

@MichaelBorgwardt对zip的惰性评估实际上可以将大数组的代码速度提高400倍。也许更多
bobrobbob

6

我认为,最终归根结底,Python并未尽其所能进行优化。大多数常见的优化技术都是针对静态语言的。还有对动态语言的优化技术,但似乎是现代的不使尽可能多的使用它们,因为它们可能。史蒂夫·耶格(Steve Yegge)对此主题发表了出色的博客文章

编辑:我只是想指出,我并不一定要指出这对Python至关重要。我更喜欢简单而不是不必要的速度。


5

它与语言本身没有任何关系,只是Java实现运行时系统(JVM)的质量很高,并且多年来已在稳定性,可伸缩性和性能改进方面投入了大量资源。

与之相反,CPython实现是最近才实现的,例如在其解释器中实现了线程调度,这使它在某些问题上的性能提高了20%。听起来这不是一件好事,而是不好的,因为从一开始就应该进行这种基本的优化。


3

此类问题不能仅通过定性推理来回答,您需要良好的基准来对其进行支持。这是一组比较Python 3与C#Mono并发现Python慢​​3到300倍的工具。Python与Java的结果相似。(通常需要注意解释基准的注意事项。)

这些基准测试还报告了源代码的大小,Python比Java和C#简洁得多。


该链接似乎已死:-(
starbeamrainbowlabs

2

我认为相反。我可以使用Python比使用Java更快地执行简单的程序,并且这些Python脚本的运行速度非常快。

当然,没有示例的问题很难回答。也许您发现库慢,错误等。请给我们更多详细信息。


2

由于它是解释的而不是未编译的,因此它的执行时间应该更慢。

如第600页的“代码完整(第二版)”书中提到的表格,

C#的执行时间等于C ++ (1:1)。而且Python的执行时间比C ++慢一百倍以上(> 100:1)。

Java比C ++慢一半半(1.5:1)。

这些统计是平均水平。我不知道是谁做的这项研究,但看起来很有趣。


1

我认为编写Python代码的简便性使编写更复杂的代码成为可能。例如,利用多核处理器的代码。由于过去5到10年间每个内核的性能几乎停滞不前,因此我认为,从长远来看,Python程序(无论它们是在CPython还是其他程序上运行)并不明显。


不挂断。CPython使用引用计数。任何要求的代码都不太可能在多核上运行良好。
Tom Hawtin-抢险

我在沿着stdlib中的“多处理”思路进行更多思考。
DNS

记住,记住,Python的GIL。
EstebanKüber'09

4
为了实现真正的规模,无论如何您都需要使用多个物理机。为此,除了使用多个进程外别无选择。因此,也要在单台计算机上使用多个进程,并且如果需要,您已经拥有一个可以扩展到比该单台计算机更大的系统,并且主机OS将在所有内核上运行子进程。一旦开始考虑多处理,GIL就没什么大不了的。
Caleb Hattingh,2009年
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.