Python比Java / C#更慢吗?

Python比Java / C#更慢吗?

性能比较-C-java的蟒-rubyJython的JRuby的常规

这是一个优化CPython的项目: unladen-swallow

不要混淆语言和运行时间。

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

  • CPython通常被解释,并且比C#本地代码慢。 它可能比Java慢,具体取决于Java JIT编译器。

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

  • IronPython和C#依赖于相同的.NET库和IL,所以性能差异会相对较小。

  • Python可以通过PyREX,PyToC等转换为本地代码。 在这种情况下,它通常会像C ++一样执行。 你可以 – 在一定程度上 – 进一步优化C ++,并可能比PyREX的未优化输出性能稍微好一些。

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

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

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

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

dynamic语言系统很容易实现。 任何白痴都可以做到。 我有。 静态语言系统的devise和实现比较复杂。 一个简单的静态系统将比同等的正常工作的dynamic等价物运行得更快。 但是,高度优化的dynamic系统运行速度几乎可以一样快。 我理解一些Smalltalk的实现是相当不错的。 经常被引用的dynamic系统的例子是MIT Lisp Machine 。

另外,如果真正的咕噜声是由图书馆代码完成的,那么语言系统可能就不重要了。 或者,这种语言可能会鼓励(或者给予时间(!))来开发更有效的algorithm,这些algorithm可以轻易消除常数因子性能差异。

正如其他答案中提到的,这取决于运行时系统以及手头的任务。 所以标准(C)Python不一定比Java或C#慢。 它的一些模块是用C语言实现的。所以把一个本地实现的速度和Python的语言结合起来。

我们做了一个小实验:我们比较了不同语言中因子计算的执行时间。 该testing实际上是为了评估任意精度整数实现的性能。

testing对象。 语言任意精度的整数运行时

      1. Java java.math.BigInteger JRE 6.13
      2. .NET System.Numerics.BigInteger MS CLR 4.0
      3. Python长的活动Python 2.6.2.2
      4.吱吱嘎吱嘎吱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.424ms 1.243ms 836ms 3.360ms 1.675ms
    40.000!  6.340ms 2.101ms 1.975ms 6.738ms 3.042ms
    50.000!  10.493ms 3.763ms 3.658ms 10.019ms 5.242ms
    60.000!  15.586 ms 7.683 ms 5.788 ms 14.241 ms 10.000 ms

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

条形图显示结果。 Python是明显的赢家。 就我所知,Python使用Karatsubaalgorithm来乘以大整数,这就解释了速度。

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

简单地说 – Python很慢

无论使用什么解释器(当前可用),它都比Java和C慢。在各种基准testing中,它比Ruby和PHP慢。 不要依赖他人的答案,检查和validation自己。

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)中开发webapps。 但是我实际上看到了我的工作和经验,Python如何变慢。 速度并不总是我的首要任务。 但是我确实站在他们身边,他说Python解释器应该至less在马拉松比赛中进行加油或换油。 这是一种主stream的编程语言。

正如评论中所build议的,你应该真的提供一个testing用例来推理。 性能差异背后的原因将根据正在执行的testing而改变。

但是,我build议静态与dynamic性质可能有很多关系。 对于非虚拟调用,JIT编译的C#/ Java是非常便宜的,因为它可以在JIT时间准确地确定。 即使是虚拟呼叫也只涉及单一级别的redirect。 当绑定变得dynamic时,需要考虑更多的事情。

我不知道有关Python的足够详细信息来声明它的确切运行时行为,我怀疑它可能随着版本和实现而变化。 有一个“python字节码”,然后由虚拟机执行 – 不pipe这个虚拟机是否实际执行JIT编译是另一回事。

归结起来,编译阶段的信息较less,因此运行时需要在duck typed(dynamictypes)语言的情况下做更多的工作。

因此,如果我正在调用foo.bar()方法,那么在Java或C ++的情况下,可以在编译过程中通过发现“foo”的types来优化对bar的调用,然后直接在内存位置调用方法编译器知道它会被find。 由于python或任何其他dynamictypes的语言编译器不知道对象foo属于什么types,所以它必须在运行时进行types检查,然后查找bar方法的地址,然后调用它。

python编译器作家还有其他一些困难,尽pipe上面的一个希望充分地给出一个指示。 所以即使使用最好的编译器编译器,静态types语言在运行时也可能performance得更好。

dynamictypes语言得分通常在开发时间。 由于需要编写和维护的代码行数量较less,开发人员也没有编译等待时间,所以开发速度往往要快得多。

你在那里得到了一个在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 

我认为最终Python并没有尽可能地进行优化。 大多数常用的优化技术都是针对静态语言的。 有dynamic语言的优化技术,但现代的似乎并没有尽可能多地使用它们。 Steve Yegge 在这个问题上有一个很好的博客文章 。

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

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

相比之下,CPython实现刚刚实现,例如在其解释器中进行了线程调度,这使得某些问题的性能提高了20%。 这听起来并不是什么好事,但是从一开始就应该有那种基本的优化,这是不好的。

这种types的问题不能仅仅由定性推理来回答,你需要很好的基准来支持它。 这里有一个比较Python 3和C#Mono的集合,发现Python速度要慢3到300倍。 Python与Java的结果是相似的。 (关于解释基准的通常注意事项适用。)

这些基准testing还报告了源代码的大小,Python比Java和C#更加简洁。

我认为是相反的。 我可以比使用Java更快地完成简单的Python程序,而且这些Python脚本的工作速度非常快。

当然你没有例子的问题很难回答。 也许你已经发现缓慢的图书馆,错误等请给我们更多的细节。

我认为,编写Python代码的简易性使得编写更复杂的代码成为可能。 例如,利用多核处理器的代码。 由于过去5 – 10年每个内核的性能一直停滞不前,我不认为Python程序(无论是在CPython上运行还是其他)在长期运行速度较慢。

由于它的解释和不编译..它应该在执行时间较慢。

作为Code Complete(第二版)第600页中提到的表格,

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

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

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