代码之家  ›  专栏  ›  技术社区  ›  rapadura

这个python代码有什么问题吗?为什么它比ruby运行得那么慢?

  •  4
  • rapadura  · 技术社区  · 15 年前

    我有兴趣比较Rubyspeed和python,所以我采用了最简单的递归计算,即打印fibonacci亮片。

    这是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
    

    这是红宝石代码

    #!/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
    

    在几次运行中,时间报告此平均值

    real    0m4.782s 
    user    0m4.763s 
    sys     0m0.010s
    

    那是红宝石,现在python2.7给出了

    real    0m11.605s
    user    0m11.563s
    sys     0m0.013s
    

    这笔交易是什么?

    5 回复  |  直到 15 年前
        1
  •  7
  •   dcolish    15 年前
        2
  •  2
  •   Sven Marnach    15 年前

    a, b = 1, 1
    for i in range(35):
        a, b = b, a+b
    print b
    
        3
  •  2
  •   Rafe Kettler    15 年前

    def fibo_generator(n):
        # gets Fibonacci numbers up to nth number using a generator
        a, b = 0, 1
        for _ in range(n):
            yield a
            a, b = b, a + b
    

    for f in fibo_generator(35):
        print f
    

        5
  •  2
  •   jfs    15 年前

    Python2.7
    9.67 user 0.09 system 0:09.78 elapsed 99%CPU (0avgtext+0avgdata 16560maxresident)k
    0inputs+0outputs (0major+1169minor)pagefaults 0swaps
    
    ruby 1.8.7 (2010-06-23 patchlevel 299) [x86_64-linux]
    28.37 user 0.35 system 0:28.78 elapsed 99% CPU (0avgtext+0avgdata 9200maxresident)k
    1896inputs+0outputs (9major+656minor)pagefaults 0swaps
    
    ruby 1.9.2p0 (2010-08-18 revision 29036) [x86_64-linux]
    6.21 user 0.08 system 0:06.36 elapsed 98% CPU (0avgtext+0avgdata 14160maxresident)k
    4416inputs+0outputs (16major+953minor)pagefaults 0swaps
    

    2.4.6 took 10.30 seconds
    
    2.5.5 took 9.93 seconds
    
    2.6.6 took 9.22 seconds
    
    2.7   took 9.35 seconds
    
    3.0.1 took 11.67 seconds
    
    3.1.2 took 11.35 seconds
    
    3.2a3+ (py3k:85895, Oct 29 2010, 01:41:57) 
    [GCC 4.4.5] took 13.09 seconds
    
    2.5.2 (77963, Oct 15 2010, 02:00:43)
    [PyPy 1.3.0] took 21.26 seconds
    
    2.5.1 (Release_2_5_1:6813, Sep 26 2009, 13:47:54) 
    [OpenJDK 64-Bit Server VM (Sun Microsystems Inc.)] took 8.81 seconds