Python与C的性能差异
一、Python与C的差异
1.差异解释
Python是解释性语言,而C是编译型语言,Python需要在运行时逐行解释代码,而C在运行之前已经将代码转换成机器代码,这是什么意思呢?用通俗的话来讲(个人理解,如有错,欢迎纠正),就是:
- 解释性语言:写代码时:相当于你在纸上写下了英文;运行时:相当于你需要翻译纸上的英文,才能读懂,这个过程是需要时间的
- 编译型语言:写代码时:此时你已经在纸上写下了中文;运行时:你只需要看一眼纸上的中文就能明白意思,这个过程比上述过程快多啦
2.任务执行差异
C支持多线程任务,而Python因为有GIL(Global Interpreter Lock,全局解释器锁),在运行代码时,Python会释放GIL,导致只能在任何给定时间内只有一个线程可以执行,这就无法充分的利用多核处理器的优势了,所以呢,在CPU密集型任务中,Python的性能在大部分情况下是不如C的,但Python对处理IO密集型任务是很有优势的。
- IO密集型任务:指在任务执行过程中,主要涉及外部资源(如磁盘文件读写)操作
- CPU密集型任务:写代码时:指在任务执行过程中,主要涉及CPU运算任务
二、性能差异对比前工作
1.(Python)在进行差异对比前,我们需要导入time库,以方便统计CPU计算时间:
import time
2.©在进行差异对比前,我们需要导入time.h头文件,以方便统计CPU计算时间:
#include <stdio.h>
#include <time.h>
三、性能差异对比代码
(Python)这里以斐波那契数列进行举例,由于项数过小可能无法清楚的对比两者的差异,故统一设定项数n=4440
def fibonacci(n):
if n <= 1:
return n
a, b = 0, 1
for _ in range(2, n+1):
c = a + b
a = b
b = c
return b
n = 4440
start = time.time()
number_sum = fibonacci(n)
end = time.time()
time_used = end - start
print("第{}项斐波那契数列的值为:{}".format(n, number_sum))
time_str = "运算时间为: {:.9f} 秒".format(time_used)
print(time_str)
(C)我没有安装gmp库,就暂时使用(long long int)型代替,结果可能会有偏差:
int fibonacci(int n) {
if (n <= 1) {
return n;
}
long long int a = 0;
long long int b = 1;
long long int c;
for (int i = 2; i <= n; i++) {
c = a + b;
a = b;
b = c;
}
return b;
}
int main() {
int n = 440;
clock_t start, end;
double time_used;
start = clock();
long long int number = fibonacci(n);
end = clock();
time_used = ((double)(end - start)) / CLOCKS_PER_SEC;
printf("第%d项斐波那契数列的值为:%llu\n", n, number);
printf("运行该斐波那契数列所用时间: %.9f 秒\n", time_used);
return 0;
}
三、差异对比结果图
Python的CPU运算时间:
C的CPU运算时间:
(注:这里均选用的是保留九位小数点(.9f))