相关疑难解决方法(0)

Ruby执行尾部调用优化吗?

功能语言导致使用递归来解决许多问题,因此许多函数执行尾调用优化(TCO).TCO导致从另一个函数调用函数(或者本身,在这种情况下,这个特性也称为Tail Recursion Elimination,它是TCO的一个子集),作为该函数的最后一步,不需要新的堆栈帧,这减少了开销和内存使用.

Ruby显然已经从函数式语言(lambdas,map等函数等)中"借用"了许多概念,这让我很好奇:Ruby是否执行尾调用优化?

ruby functional-programming tail-recursion

90
推荐指数
3
解决办法
1万
查看次数

为什么等效的Python代码要慢得多

有人可以解释为什么下面这些简单的代码(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)

ruby python python-3.x

19
推荐指数
3
解决办法
4145
查看次数

为什么python比Ruby更慢,即使这个非常简单的"测试"呢?

看看这个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 …

ruby python testing performance

2
推荐指数
1
解决办法
1610
查看次数