当前位置:  开发笔记 > 编程语言 > 正文

Python比Java/C#慢吗?

如何解决《Python比Java/C#慢吗?》经验,为你挑选了9个好方法。

Python比Java/C#慢吗?

性能比较-C-java的蟒-红宝石Jython的JRuby的常规

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



1> S.Lott..:

不要混淆语言和运行时.

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

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

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

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

Python可以通过PyREX,PyToC等转换为本机代码.在这种情况下,它通常会像C++一样运行.你可以 - 在某种程度上 - 进一步优化C++,并且可能比PyREX的未优化输出挤出更好的性能.

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

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


Jython根本没有与Java相同的性能配置文件.事实上,我在问题中提到的博客文章中对它进行了基准测试,并且它比java慢得多.
当然,不要将语言与运行时混淆,也不要将一个随意措辞的问题与其字面含义混为一谈.当人们提出这类问题时,他们几乎总是意味着,*没有不寻常的努力或成本,最快的非深奥的实现加上典型的运行时环境(往往意味着相对现代的Windows或Linux系统)往往会更快对于典型的开发("典型"取决于上下文,但通常与通用Enterprisey的东西,脚本和/或Web开发相关 - 并且很少数值集成 - 普通开发人员)?*
C#和IronPython在不同的速度下运行.这是可以预料的; Python是一种更高级的语言(同样,IronPython编译器也不像C#那样成熟)
这就是重点 - 事实是Jython甚至没有远程拥有Java的性能配置文件.无论这是由于JVM还是JVM上的语言或其实现,都是另一回事.对我来说,它看起来是后者,特别是因为JRuby似乎与Ruby的C实现相提并论.
@Michael Borgwardt:这是通常的罪魁祸首 - 但不是Pythonic的"基准"并不是可接受的比较.在进行比较之前,没有人试图将所有Python的动态内存管理添加到C程序中,以证明C比CPython更快.

2> Tom Hawtin -..:

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

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

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

另外,如果真正的grunt是由库代码完成的,那么语言系统可能无关紧要.或者,该语言可以鼓励(或给予时间(!))开发更有效的算法,这些算法可以容易地消除常数因子性能差异.


我不认为*任何*白痴都可以做到.这需要一个非常特殊的白痴:)
一个非常有趣的咆哮!:)

3> wierob..:

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

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

testee. language arbitrary-precision integers run-time

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

results:

                 1)         2)       3)       4)        5)
   10.000!      343 ms    137 ms    91 ms  1.200 ms    169 ms
   20.000!    1.480 ms    569 ms   372 ms  1.457 ms    701 ms
   30.000!    3.424 ms  1.243 ms   836 ms  3.360 ms  1.675 ms
   40.000!    6.340 ms  2.101 ms 1.975 ms  6.738 ms  3.042 ms
   50.000!   10.493 ms  3.763 ms 3.658 ms 10.019 ms  5.242 ms
   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使用Karatsuba算法来乘以大整数,这解释了速度.

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


@Comptrol这些已经过时了 - http://shootout.alioth.debian.org/u32q/benchmark.php?test=all&lang=python&lang2=java和http://shootout.alioth.debian.org /u32q/benchmark.php?test=all&lang=python&lang2=csharp

4> Ravi Kumar..:

简单 - 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中开发webapps而不是Spring(Java).但我几乎在工作和经验中看到Python的速度较慢.速度并不总是我的首要任务.但是我确实与他们站在一起,他们说Python解释器应该加油和润滑,或者总是改变发动机,至少要参加马拉松比赛.它是一种主流编程语言.


开发人员的时间更有价值.

5> Jon Skeet..:

正如评论中所建议的那样,您应该提供一个测试用例来推理.性能差异背后的原因将根据正在执行的测试而改变.

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

我不太了解有关Python的详细信息,声称要了解其确切的运行时行为,我怀疑它可能因版本和实现而异.有一个"python字节代码",然后由虚拟机执行 - 这个虚拟机是否实际执行JIT编译是另一回事.



6> Dhananjay Ne..:

它归结为这样一个事实,即编译阶段具有较少的信息可供使用,因此运行时需要在鸭类型(动态类型)语言的情况下做更多的工作.

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

python编译器编写者还有其他困难,尽管上面的那个有希望充分表明.因此,即使使用最好的编译器编写器,静态类型语言在运行时也可能表现得更好.

动态类型语言得分通常在开发时间内.由于编写和维护的代码行数较少,而且开发人员没有编译等待时间,因此开发速度通常要快得多.


鸭子!=动态.
"由于编写和维护的代码行数较少" - 维护部分主要是hogwash.随着项目的增长,您将会发现修复python中的错误是多么艰难.而且,如果人们去压缩东西,读取python代码通常很难阅读

7> vartec..:

你在那里得到的是用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


除非你能提供证据或推理为什么"pythonic"版本的速度要快400倍,否则它就无关紧要了.
我认为指出所有那些挑剔的低级别琐事可能比直接的pythonic方法更慢是非常相关的.但是后者有一个错误 - .append()返回None; vartec可能意味着链[1:] +链[:1].

8> Jason Baker..:

我认为最终Python并没有尽可能地优化.大多数常见的优化技术都是静态语言.还有对动态语言的优化技术,但似乎是现代的不使尽可能多的使用它们,因为它们可能.Steve Yegge有一篇关于这个主题的优秀博客文章.

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



9> Marko..:

它与语言本身没有任何关系,只是Java 实现运行时系统(JVM)质量非常高,而且多年来已投入大量资源来提高稳定性,可伸缩性和性能.

与最近刚刚实施的CPython实现相比,例如在其解释器中实现了线程调度,这使得某些问题的性能提升高达20%.这听起来不是一件好事,这很糟糕,因为那种基本的优化应该从第一天开始.

推荐阅读
黄晓敏3023
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有