Python比Java / C#慢吗?
performance-comparison-c-java-python-ruby-jython-jruby-groovy
这是一个优化CPython的项目:unladen-swallow
答案 0 :(得分:121)
不要混淆语言和运行时。
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 ++慢。
答案 1 :(得分:59)
要问为什么Python比Java / C#慢,这是不正确的。 Java速度有多快?好吧,天真的解释器比优化的编译器慢十倍。我相信有一个用JavaScript编写的Java bytcode解释器 - 可能不是很快。因此,预期的问题似乎是“为什么CPython语言系统比同等的Sun,IBM和Oracle JRE以及Microsoft .NET运行时慢?”
我认为正确的答案是非技术性的。最快的Java和.NET运行时速度更快,因为他们有大型的全职技术团队在竞争激烈的环境中开发它们。
动态语言系统易于实施。任何白痴都可以做到。我有。静态语言系统的设计和实现更加复杂。一个简单的静态系统往往比等效的刚刚工作的动态等效系统运行得快得多。但是,高度优化的动态系统可以几乎同样快速地运行。我理解一些Smalltalk实现非常好。经常引用的动态系统示例是MIT Lisp Machine。
此外,如果真正的grunt是由库代码完成的,那么语言系统可能无关紧要。或者,该语言可以鼓励(或给予时间(!))开发更有效的算法,这些算法可以轻松消除常数因子性能差异。
答案 2 :(得分:38)
正如其他答案所述,这取决于运行时系统以及手头的任务。所以标准(C)Python不一定比Java或C#慢。它的一些模块是用C实现的。因此将 native 实现的速度与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
条形图显示结果。 Python是明显的赢家。据我所知,Python使用Karatsuba-algorithm来乘以大整数,这解释了速度。
此外,Python的“任意精度整数”-type是内置的long
。因此,您甚至不需要Java的BigInteger类所需的特殊类型处理。
答案 3 :(得分:25)
简单 - Python很慢。
无论你使用什么解释器(目前可用),它都比Java和C慢。在各种基准测试中,它比Ruby和PHP慢。 不要依赖别人的答案,检查并验证自己。
就我个人而言,我认为,对于快速获取python有很多认真的贡献和发展。由于python中的生产力很好并且它直接解决了一些问题,因此速度/性能不会受到重视。还有一些架构问题也阻止了Python进行性能调整。
免责声明 - 这个答案可能会伤害Python爱好者。我也是Python开发人员,喜欢在Django / Flask / Pyramid中开发webapps而不是Spring(Java)。但我几乎在工作和经验中看到Python的速度较慢。速度并不总是我的首要任务。但是我确实与他们站在一起,他们说Python解释器应该加油和润滑,或者总是更换发动机以至少站在马拉松比赛中。它是一种主流的编程语言。
答案 4 :(得分:15)
正如评论中所建议的,你应该提供一个测试用例来推理。性能差异背后的原因将根据正在执行的测试而改变。
但是,我建议静态与动态性质可能与它有很大关系。对于非虚拟调用,JIT编译的C#/ Java非常便宜,因为它可以在JIT时间准确确定。即使是虚拟调用也只涉及一个级别的重定向。当绑定变得动态时,需要考虑更广泛的事情。
我不太了解有关Python的详细信息,声称要了解其确切的运行时行为,我怀疑它可能因版本和实现而异。有一个“python字节代码”,然后由虚拟机执行 - 这个虚拟机是否实际执行JIT编译是另一回事。
答案 5 :(得分:14)
归结为编译阶段的信息较少,因此运行时需要在鸭类型(动态类型)语言的情况下做更多的工作。
因此,如果我正在进行方法调用foo.bar(),在Java或C ++的情况下,可以通过发现“foo”的类型然后直接调用该方法来在编译过程中优化对bar的调用。内存位置,编译器知道它将被找到。由于python或任何其他动态类型语言编译器不知道对象foo属于哪种类型,它必须在运行时进行类型检查,然后查找bar方法的地址然后调用它。
python编译器编写者还有其他困难,尽管上面的那个有希望充分表明。因此,即使使用最好的编译器编写器,静态类型语言在运行时也可能表现得更好。
动态类型语言得分通常在开发时间内。由于编写和维护的代码行数较少,而且开发人员没有编译等待时间,因此开发过程通常要快得多。
答案 6 :(得分: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
答案 7 :(得分:6)
我认为最终Python并没有尽可能地优化。大多数常见的优化技术都是静态语言。有 动态语言的优化技术,但现代的动态语言似乎没有尽可能多地使用它们。 Steve Yegge有一个很棒的blog post on the subject。
编辑:我只想指出,我并不一定要说这是对Python的批评。我喜欢简单而不是不必要的速度。
答案 8 :(得分:5)
它与语言本身没有任何关系,只是java 实现和运行时系统(JVM)的质量非常高,而且多年来,在稳定性,可扩展性和性能改进方面投入了大量资源。
与CPython实现最近实现的事实形成对比,例如在其解释器中实现了线程调度,这使得某些问题的性能提升高达20%。这听起来不是一件好事,这很糟糕,因为那种基本的优化应该从第一天开始。
答案 9 :(得分:3)
这种类型的问题无法通过定性推理来回答,您需要良好的基准来支持它。这是一组比较Python 3 vs C# Mono并发现Python慢3到300倍的集合。 Python与Java的结果相似。 (通常关于解释基准的注意事项适用。)
这些基准测试还报告了源代码大小,Python比Java和C#更简洁。
答案 10 :(得分:2)
因为它被解释而不是编译..它的执行时间应该更慢。
作为代码完成(第二版)一书中提到的表格,第600页,
C#在执行时间(1:1)中等于C ++。在执行时间(> 100:1)中,Python比C ++慢一百倍。
Java比C ++慢一个半(1.5:1)。
这些统计数据是平均的。我不知道是谁做了这项研究,但看起来很有趣。
答案 11 :(得分:1)
我认为相反。我可以用Python在Java中执行简单的程序, 那些Python脚本工作得非常快。
当然,没有例子的问题很难回答。也许你找到了慢库,bug等。请给我们更多细节。
答案 12 :(得分:1)
我认为编写Python代码的简单性和简单性使编写更复杂的代码成为可能;例如,利用多核处理器的代码。由于过去5到10年内每个核心的性能大多停滞不前,我认为从长远来看,Python程序(无论是在CPython上运行还是其他东西)都不会很慢。