Python比Java / C#慢吗?
性能比较c-java-python-ruby-jython-jruby-groovy
这是一个优化CPython的项目:空载吞咽
Answers:
不要混淆语言和运行时。
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 ++慢。
问为什么Python比Java / C#慢是不正确的。Java有多快?好吧,天真的解释器比优化的编译器慢大约十倍。我相信有一个用JavaScript编写的Java字节码解释器-可能不是很快。因此,预期的问题似乎是“为什么CPython语言系统比等效的Sun,IBM和Oracle JRE和Microsoft .NET运行时要慢?”
我相信正确的答案是非技术性的。最快的Java和.NET运行时更快,因为它们拥有庞大的全职技术团队在性能竞争的环境中开发它们。
动态语言系统易于实现。任何白痴都可以做到。我有。静态语言系统的设计和实现更加复杂。一个简单的静态系统往往会比等效的动态工作系统快得多。但是,高度优化的动态系统有可能以几乎相同的速度运行。我了解一些Smalltalk实施非常好。经常引用的开发动态系统的示例是MIT Lisp Machine。
另外,如果真正的苦恼是由库代码完成的,那么语言系统可能没关系。或者,该语言可能鼓励(或花时间(!))开发更有效的算法,从而可以轻松消除恒定因子性能差异。
如其他答案中所述,这取决于运行时系统以及手头的任务。因此,标准(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毫秒
条形图显示结果。Python无疑是赢家。据我所知,Python使用Karatsuba算法将大整数相乘,这说明了速度。
此外,Python的“任意精度整数”类型是内置的long
。因此,您甚至不需要Java的BigInteger类所需的特殊类型处理。
Simply- Python很慢。
无论使用哪种解释器(当前可用),它都比Java和C慢。在各种基准测试中,它比Ruby和PHP慢。不要依赖他人的答案,请检查并验证自己。
我个人认为,在更快地获取python方面已经做出了许多认真的贡献和发展。由于python的生产率很高,并且可以直接解决一些问题,因此速度/性能并没有受到重视。也有一些架构问题阻止Python进行性能调整。
免责声明-此答案可能会伤害Python爱好者。我也是Python开发人员,喜欢用Django / Flask / Pyramid(而不是Spring(Java))开发Web应用程序。但是从我的工作和经验中,我实际上看到了Python变慢的速度。速度并不总是我的首要任务。但是我确实支持他们,他们说Python Interpreter应该加油和润滑,或者总的更换引擎,至少可以参加马拉松比赛。它是一种主流的编程语言。
如评论中所建议,您确实应该提供一个测试用例进行推理。性能差异背后的原因将根据所执行的测试而改变。
但是,我建议静态与动态性质可能与它有很大关系。对于非虚拟调用,JIT编译的C#/ Java非常便宜,因为它可以在JIT时准确确定。甚至虚拟呼叫也只涉及一个重定向级别。当绑定变得动态时,需要考虑的范围更广。
我不了解有关Python的足够详细信息,无法声称自己了解其确切的运行时行为,我怀疑它的版本和实现也会有所不同。诸如“ python字节码”之类的东西然后由虚拟机执行-该虚拟机是否实际执行JIT编译是另一回事。
归结为一个事实,即编译阶段需要处理的信息较少,因此在使用鸭子类型(动态类型)的语言时,运行时需要做更多的工作。
因此,如果我要对方法foo.bar()进行调用,则在Java或C ++的情况下,可以通过在编译过程中发现“ foo”的类型,然后在内存位置直接调用该方法来优化对bar的调用编译器知道将找到它。由于python或其他任何动态类型化的语言编译器都不知道对象foo属于哪种类型,因此它必须在运行时进行类型检查,然后查找bar方法的地址,然后调用它。
python编译器作者还面临其他困难,尽管上述希望可以充分说明这一点。因此,即使有最好的编译器编写器,静态类型的语言也可能在运行时表现更好。
动态类型语言得分通常在开发时间中。由于编写和维护的代码行较少,并且开发人员没有编译等待时间,因此开发过程通常要快得多。
您所得到的是使用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 3与C#Mono并发现Python慢3到300倍的工具。Python与Java的结果相似。(通常需要注意解释基准的注意事项。)
这些基准测试还报告了源代码的大小,Python比Java和C#简洁得多。
我认为相反。我可以使用Python比使用Java更快地执行简单的程序,并且这些Python脚本的运行速度非常快。
当然,没有示例的问题很难回答。也许您发现库慢,错误等。请给我们更多详细信息。
由于它是解释的而不是未编译的,因此它的执行时间应该更慢。
如第600页的“代码完整(第二版)”书中提到的表格,
C#的执行时间等于C ++ (1:1)。而且Python的执行时间比C ++慢一百倍以上(> 100:1)。
Java比C ++慢一半半(1.5:1)。
这些统计是平均水平。我不知道是谁做的这项研究,但看起来很有趣。
我认为编写Python代码的简便性使编写更复杂的代码成为可能。例如,利用多核处理器的代码。由于过去5到10年间每个内核的性能几乎停滞不前,因此我认为,从长远来看,Python程序(无论它们是在CPython还是其他程序上运行)并不明显。