24

计算斐波那契数列的性能对比:Python,Java,Go

 5 years ago
source link: https://studygolang.com/articles/25677
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

  本文采用递归办法来计算斐波那契数列中的第38项,用于对于三种计算机语言的计算性能,这三种语言为:Python,Java,Go。

  我们采用递归法来求解斐波那契数列的第n项f(n),其算法描述如下:

function fib(n)
    if n = 0 return 0
    if n = 1 return 1
    return fib(n − 1) + fib(n − 2)

对于公平起见,我们利用三种程序计算f(38),运行100遍,得到平均耗时,作为性能对比。

  Python程序如下:

# -*- coding: utf-8 -*-
# author: Jclian91
# place: Pudong Shanghai
# time: 16:15

import time

# recursive method
def rec_fib(n):
    if n <= 1:
        return n
    else:
         return rec_fib(n-1) + rec_fib(n-2)

time_cost = 0
for _ in range(100):
    # time cost of cursive method
    t1 = time.time()
    t = rec_fib(38)
    t2 = time.time()
    time_cost += (t2-t1)


print('结果:%s, 平均运行时间:%s'%(t, time_cost/100))

  Java程序如下:

import java.util.Date;

public class Main {

    // 主函数
    public static void main(String[] args) {
        double time_cost = 0;
        for (int i=0; i<100; i++) {
            Date start_time = new Date(); //开始时间
            int n = 38;
            rec_fib(n);
            Date end_time1 = new Date(); // 结束时间
            Long cost_time1 = end_time1.getTime() - start_time.getTime();  // 计算时间,返回毫秒数
            time_cost += cost_time1;
        }
        System.out.println(String.format("Average cost time is %.3fs.", time_cost*1.0/1000));
    }

    // 利用递归方法计算斐波那契数列的第n项
    public static int rec_fib(int n){
        if(n == 0)
            return 0;
        if(n ==1)
            return 1;
        else
            return rec_fib(n-1) + rec_fib(n-2);
    }

}

  Go语言如下:

// rec_fib
package main

import (
    "fmt"
    "time"
)

// 函数返回第n个斐波那契数
func rec_fib(num int) int {
    if num <= 1 {
        return num
    } else {
        return rec_fib(num-1) + rec_fib(num-2)
    }
}

func main() {
    var time_cost float64
    for i := 0; i < 100; i++ {
        t1 := time.Now()
        n := 38
        rec_fib(n)
        t2 := time.Now()
        time_cost += t2.Sub(t1).Seconds()
    }
    fmt.Printf("Average cost time: %f.\n", time_cost/100)
}

  在同一台电脑上运行,得到的结果如下:

平均耗时(单位:秒) Python Java Go / 16.0151 0.1631 0.2398

可以看到,Java在该程序的性能表现最好,Go语言的效率比Python稍慢一些,但是是同一数量级,Python的运行时间大约是Go语言的66.7倍。

  本次分享到此结束,感谢大家的阅读~


Recommend

  • 37

    有问题,上知乎。知乎是中文互联网知名知识分享平台,以「知识连接一切」为愿景,致力于构建一个人人都可以便捷接入的知识分享网络,让人们便捷地与世界分享知识、经验和见解,发现更大的世界。

  • 12
    • zhuanlan.zhihu.com 4 years ago
    • Cache

    斐波那契数列的四种实现

    斐波那契数列的四种实现上海交通大学 计算机应用技术硕士孔乙己自己知道不能和他们谈天,便只好向 Intern 说话。有一回对我说道,“你写过代码么?”我略略点一点头。他...

  • 7

    HDU4549 M斐波那契数列(矩阵快速幂+费马小定理)February 25, 2016题目链接 斐波那契数列的矩阵表示:

  • 8

    面试题精选:神奇的斐波那契数列 2020-11-20 分类:数学 /

  • 5
    • segmentfault.com 3 years ago
    • Cache

    JZ-007-斐波那契数列

    JZ-007-斐波那契数列发布于 10 月 27 日斐波那契数列大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始...

  • 10

    斐波那契(Febonacci)数列是一个神奇的数列,在很多地方都有应用,可以自行搜索相关图片体会其魅力,这里不赘述,直接来分析一下如何通过 JavaScript 来实现; 斐波那契数列形式如下: 1 1 2 3 5 8 13 21 34...

  • 6

    斐波那契数列的多种实现方法(算法9)问题:实现一函数,输入整数你,输出斐波那契数列的第n行。 这个问题很容易实现。有三种种思路: (1)递归思路根据斐波那契数列的定义不难写出递归形式的实现。但该递归实现会重复计算数列...

  • 8

    本篇是学习了《趣学算法(第2版)》 第一章之后总结的。

  • 6

    问题描述:   假设有个楼梯,每次只能走3步或者5步,问到达第N节会有几种组合? 思路分析:   这个问题需要反过来思考才能比较容易的找到规律。总共有N级台阶,因为每次要么上3阶要么上5阶,因此对于第N级台阶来说,它的前一步要么是在...

  • 8

    ← 今日好价 1209关于长新冠,我们可能都弄错了 →

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK