功能语言导致使用递归来解决许多问题,因此许多函数执行尾调用优化(TCO).TCO导致从另一个函数调用函数(或者本身,在这种情况下,这个特性也称为Tail Recursion Elimination,它是TCO的一个子集),作为该函数的最后一步,不需要新的堆栈帧,这减少了开销和内存使用.
Ruby显然已经从函数式语言(lambdas,map等函数等)中"借用"了许多概念,这让我很好奇:Ruby是否执行尾调用优化?
有人可以解释为什么下面这些简单的代码(Euclid算法的实现找到最大的共同点)比Ruby中的等效代码慢3倍?
iter_gcd.py的内容:
from sys import argv,stderr
def gcd(m, n):
if n > m:
m, n = n, m
while n != 0:
rem = m % n
m = n
n = rem
return m
# in Python3 code there is xrange replaced with range function
def main(a1, a2):
comp = 0
for j in xrange(a1, 1, -1):
for i in xrange(1, a2):
comp += gcd(i,j)
print(comp)
if __name__ == '__main__':
if len(argv) != 3:
stderr.write('usage: {0:s} num1 num2\n'.format(argv[0]))
exit(1) …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 …