python、java、c、go执行速度对比

闲来无事,我对java、c、python、go的运算速度做了对比,执行的基准代码是:

python版本

NUM = 111181111   # 这是素数, 因此在循环结束前不会退出

def is_prime(n):
    i = 2
    while i < n:
        if n % i == 0:
            return False
        i += 1
    return True



if __name__ == '__main__':
    is_prime(NUM)

测试的方式是使用linux的time命令,时间统一用total统计,比如统计go语言执行时间的命令如下:

➜  Desktop time ./speed
./speed  1.01s user 0.02s system 97% cpu 1.048 total

统计java如下:

➜  src git:(master) ✗ time java eg.Speed
java eg.Speed  1.14s user 0.05s system 95% cpu 1.256 total

最终结果统计如下:

语言 执行时间(total)秒
python 2.7.13 11.256
python 3.7.0 11.462
java 1.8.0_121 HotSpot 1.256
c (Apple LLVM version 10.0.0) 1.069
go 1.8.1 1.048

结论

go和c最快,java略慢,python2与python3速度差不多,但比前面三种语言慢10倍。原因我也查了一下, 简单来说是因为2点:1. Python等动态类型语言,在执行每一个简单的操作时都需要大量的指令才能完成(包括做类型判断,不同类型找出各自的方法,执行不同的指令); 2. C语言和Python的数据结构和算法不同.

:听青南安利说用rust可能更快,鉴于没写过rust,因此就不实验了。

其他几个代码的版本如下:

java版本

package eg;

public class Speed {
    static final long NUM = 111181111L;

    public boolean isPrime(long n) {
        long i = 2L;
        while (i < n) {
            if (n % i == 0) {
                return false;
            }
            i += 1;
        }
        return true;
    }


    public static void main(String[] args) {
        Speed s = new Speed();
        s.isPrime(NUM);
    }
}

c版本

int is_prime(long n) {
    long i = 2L;
    while (i < n) {
        if (n % i == 0) {
            return 0;
        }
        i += 1;
    }
    return 1;
}

int main() {
    const long NUM = 111181111L;
    is_prime(NUM);
}

go版本

package main

func is_prime(n int) bool {
    /* 声明局部变量 */
    var i = 2
 
    for i < n {
        if n % i == 0 { 
            return false
        }
        i++
    }
    return true
}

func main() {
    const NUM int = 111181111
    is_prime(NUM)
}