很多人詬病的python運(yùn)行效率問題。我們來做個(gè)對(duì)比。
同樣寫一段斐波那契數(shù)列程序,對(duì)比一下以上幾種語言的運(yùn)行效率。
C程序:
#include <stdio.h>
#include <time.h>
int fib(int n)
{
if (n <= 1)
{
return n;
}
else
{
return fib(n - 1) + fib(n - 2);
}
}
int main()
{
clock_t start, end;
double cpu_time_used;
start = clock(); // 開始計(jì)時(shí)
int n;
printf("請(qǐng)輸入一個(gè)整數(shù): ");
scanf("%d", &n);
fib(n);
end = clock(); // 結(jié)束計(jì)時(shí)
cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC; // 計(jì)算時(shí)間
printf("程序執(zhí)行時(shí)間為: %f seconds\n", cpu_time_used);
return 0;
}
C++程序:
#include <bits/stdc++.h>
#include <ctime>
#define CLOCK_PER_SEC 1000
using namespace std;
typedef long long ll;
ll step=0,cnt=0;
int Digui(ll step)
{
cnt++;
if(step==1||step==2)
{
return 1;
}
return Digui(step-1)+Digui(step-2);
}
int main()
{
clock_t start = clock();
Digui(40);
clock_t end = clock();
cout<<"花費(fèi)了:"<<(double)(end-start)/CLOCK_PER_SEC<<"毫秒"<<endl;
return 0;
}
Go程序:
package main
import (
"fmt"
"time"
)
func Fib(n int) int {
if n == 1 || n == 2 {
return 1
}
return Fib(n-2) + Fib(n-1)
}
func main() {
now_t := time.Now()
Fib(40)
end_t := time.Now()
fmt.Println("時(shí)間差:", end_t.Sub(now_t))
}
python程序
import time
def fib(n):
if n == 1 or n == 2:
return 1
return fib(n - 1) + fib(n - 2)
if __name__ == '__main__':
start_time = time.time()
fib(40)
end_time = time.time()
print("消耗時(shí)間:",end_time-start_time)
python 編譯成so文件,程序跟Python是一致的,只是把python編譯成了so二級(jí)制,再調(diào)用執(zhí)行:
算的是,40以內(nèi)的斐波那契數(shù)列。C和C++編譯時(shí),使用的-03優(yōu)化。還可以使用緩存優(yōu)化,考慮到對(duì)比的公平性沒有做。時(shí)間單位統(tǒng)一成了秒。其中C++和Go語言的運(yùn)行時(shí)間,兩次時(shí)間有點(diǎn)兒接近,采用多次運(yùn)行取最大。

image.png
結(jié)論:C語言最快,Go語言性能跟C++接近,python可以編譯成so執(zhí)行會(huì)使效率提升3-4倍。python需要效率的地方,可以使用numpy或者pandas執(zhí)行,由于是C開發(fā)的,效率更高。