请不要发生火焰战争.我确实不是Java的粉丝,但我认为JVM是一个相当不错且优化得很好的虚拟机.它支持JIT,非常接近流行的CPU架构的共同点.我假设CPython运行时比相应的基于JVM的运行时更远离金属.
如果我的假设是正确的,那么有人可以向我解释为什么Jython与CPython相比会遭受如此重大的性能损失吗?我最初的假设是JVM只是为静态语言设计的,而且很难将动态语言移植到它上面.然而,Clojure似乎是这一论点的一个反例.
另一方面,IronPython似乎做得很好.我相信这两个项目的主要开发人员是相同的,所以一个代码设计和实现明显优于另一个的论点似乎不太可能.
我无法弄清楚具体原因是什么; 任何帮助将不胜感激.
我有兴趣比较ruby speed和python,所以我采用了最简单的递归计算,即打印fibonacci sequance.
这是python代码
#!/usr/bin/python2.7
def fib(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return fib(n-1)+fib(n-2)
i = 0
while i < 35:
print fib(i)
i = i + 1
Run Code Online (Sandbox Code Playgroud)
这是红宝石代码
#!/usr/bin/ruby
def fib(n)
if n == 0
return 0
elsif n == 1
return 1
else
fib(n-1)+fib(n-2)
end
end
i = 0
while (i < 35)
puts fib(i)
i = i + 1
end
Run Code Online (Sandbox Code Playgroud)
在几次运行中,时间报告此平均值
real 0m4.782s
user 0m4.763s
sys 0m0.010s
Run Code Online (Sandbox Code Playgroud)
多数民众赞成红宝石,现在python2.7给出
real …Run Code Online (Sandbox Code Playgroud) 看看这个python代码有什么问题,为什么它与ruby相比运行得如此之慢?我之前尝试理解python和ruby之间的差异.
正如igouy所指出的那样,我想出的python速度较慢的原因可能是其他原因而不是由于递归函数调用(涉及堆栈).
我做的
#!/usr/bin/python2.7
i = 0
a = 0
while i < 6553500:
i += 1
if i != 6553500:
a = i
else:
print "o"
print a
Run Code Online (Sandbox Code Playgroud)
在红宝石中它是
#!/usr/bin/ruby
i = 0
a = 0
while i < 6553500
i += 1
if i != 6553500
a = i
else
print "o"
end
end
print a
Run Code Online (Sandbox Code Playgroud)
在Linux2上的Python 3.1.2(r312:79147,2010年10月4日,12:45:09)[GCC 4.5.1]
时间python pytest.py o
6553499
真正的0m3.637s
用户0m3.586s
ruby 1.9.2p0(2010-08-18修订版29036)[x86_64-linux]时间ruby rutest.rb
o6553499
真正的0m0.618s
用户0m0.610s
让它循环越高会产生更大的差异.添加额外的0,ruby在7s完成,而python运行40s.
这是在Intel(R)Core(TM)i7 CPU M 620 …