鱼C论坛

 找回密码
 立即注册
查看: 2047|回复: 6

[技术交流] C 和 Python简易性能对比

[复制链接]
发表于 2021-10-15 00:50:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
C 和 Python的性能差别真TMD大,以求百万以内的素数为例, 算法越低效效果越明显:

运行环境: 相同

各版本的算法:

version 1: 逐个求余, 最低效
version 2: 前一半求余, 次之
version 3: 平方根求余,  最高效


结果:
version :        lang:        time:        count
1:         c :        190s :        78499
2:         c:         98s:        78500
3:         c :        4s :        78667

1:        python:        不试了,时间太长,等不了
2:        python:        2190s:        78500
3:        python:        10s:        78704


上代码:
C version1
#include <stdio.h>
#include <time.h>

int main() {
    int num;
    _Bool is_prime;
    int start, end, count = 0;

    start = time(NULL);

    printf("Prime evaluation system ###\n");
    
    printf("Please enter a legal whole number: ");
    scanf("%d", &num);

    printf("The prime between 0 and %d are: ", num);

    for(int i=2; i<=num; i++) {
        is_prime = 1;
        for(int j=2; j<i; j++) {
            
            if(!(i % j)) {
                is_prime = 0;
                break;
            }

        }
        if(is_prime == 1) {
            count ++;
            printf("%d, ", i);
        }
    }

    printf("\b\b \n");

    printf("Version 2.0: The evaluating took %ds to finish and there\'re %d prime there.\n", (end = time(NULL)) - start, count);

    return 0;
}

C version 2
#include <stdio.h>
#include <time.h>

int main() {
    int num;
    _Bool is_prime;
    int start, end, count = 0;

    start = time(NULL);

    printf("Prime evaluation system ###\n");
    
    printf("Please enter a legal whole number: ");
    scanf("%d", &num);

    printf("The prime between 0 and %d are: ", num);

    for(int i=1; i<=num; i++) {
        is_prime = 1;
        for(int j=2; j<i/2; j++) {
            
            if(!(i % j)) {
                is_prime = 0;
                break;
            }

        }
        if(is_prime == 1) {
            count ++;
            printf("%d, ", i);
        }
    }

    printf("\b\b \n");

    printf("The evaluating took %ds to finish and there\'re %d prime there.\n", (end = time(NULL)) - start, count);

    return 0;
}

C version 3
#include <stdio.h>
#include <time.h>
#include <math.h>

int main() {
    int num;
    _Bool is_prime;
    int start, end, count = 0;

    start = time(NULL);

    printf("Prime evaluation system ###\n");
    
    printf("Please enter a legal whole number: ");
    scanf("%d", &num);

    printf("The prime between 0 and %d are: ", num);

    for(int i=1; i<=num; i++) {
        is_prime = 1;
        for(int j=2; j<sqrt(i); j++) {
            
            if(!(i % j)) {
                is_prime = 0;
                break;
            }

        }
        if(is_prime == 1) {
            count ++;
            printf("%d, ", i);
        }
    }

    printf("\b\b \n");

    printf("The evaluating took %ds to finish and there\'re %d prime there.\n", (end = time(NULL)) - start, count);

    return 0;
}


Python version 1:
import time


start = time.time()

print("Prime number evaluation system ###")
num = int(input("Please enter a legal numbers: "))
count = 0

print("The prime numbers between 0 and %d are: " % num, end="")

for i in range(2, num + 1):
    is_prime = True
    for j in range(2, i):
        if not i % j:
            is_prime = False
            break
    
    if is_prime == True:
        count += 1
        print("%d, " % i, end="")

print("\b\b ")

print("Version 1.0: The prime numbers evaluation tooks %ds to finish and there\'re %d primes there" % ((time.time() - start), count))

Python version 2
import time


start = time.time()

print("Prime number evaluation system ###")
num = int(input("Please enter a legal numbers: "))
count = 0

print("The prime numbers between 0 and %d are: " % num, end="")

for i in range(2, num + 1):
    is_prime = True
    for j in range(2, i // 2):
        if not i % j:
            is_prime = False
            break
    
    if is_prime == True:
        count += 1
        print("%d, " % i, end="")

print("\b\b ")

print("Version 2.0: The prime numbers evaluation tooks %ds to finish and there\'re %d primes there" % ((time.time() - start), count))

Python version 3
import time
import math


start = time.time()

print("Prime number evaluation system ###")
num = int(input("Please enter a legal numbers: "))
count = 0

print("The prime numbers between 0 and %d are: " % num, end="")

for i in range(2, num + 1):
    is_prime = True
    for j in range(2, int(math.sqrt(i))):
        if not i % j:
            is_prime = False
            break
    
    if is_prime == True:
        count += 1
        print("%d, " % i, end="")

print("\b\b ")

print("Version 2.0: The prime numbers evaluation tooks %ds to finish and there\'re %d primes there" % ((time.time() - start), count))

当然啦, 语言得看应用场景, 脱离场景谈性能,有时无疑是追求大炮大小鸟---费劲
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-15 06:02:43 From FishC Mobile | 显示全部楼层
用c语言写一段爬虫
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-15 09:20:56 | 显示全部楼层
各有所长也各有所短,不然也不会出现多种多样的语言
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-15 10:23:53 | 显示全部楼层
本帖最后由 傻眼貓咪 于 2021-10-15 10:41 编辑
所有程序语言各有所长,在现代科技时代,Python 之所以可以在全世界排进程序语言前 10 名(甚至前 5名)必定有当中道理,以后你会慢慢知道的。

你的 C 代码:用时 314 秒(因个人电脑关系,速度有所误差,但再好,也超过 100 秒)
我的 Python 代码:



质数
米勒-拉宾质数判定法 Miller–Rabin Primality Test
计算 100万 (1,000,000)以内的所有质数,用时:1.911秒
代码:
import time

def isPrime(n, k=5): # 米勒-拉宾质数判定法 Miller–Rabin Primality Test
    from random import randint
    if n < 2: return False
    for p in [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]: # 小质数(50以内的质数作为范本)
        if not n%p: return n == p
    s, d = 0, n-1
    while not d%2:
        s, d = s+1, d>>1
    for i in range(k):
        x = pow(randint(2, n-1), d, n)
        if x == 1 or x == n-1: continue
        for r in range(1, s):
            x = (x * x) % n
            if x == 1: return False
            if x == n-1: break
        else: return False
    return True

arr = []
start_time = time.time()
for i in range(1000000):
    if isPrime(i):
        arr.append(i)
end_time = time.time() - start_time
print(f"共 {len(arr)} 个质数")
print("执行时间为:%s秒"%end_time)
共 78498 个质数
执行时间为:1.9118878841400146秒
虽然 C 语言速度快于 Python,但是好的代码,可以弥补速度上的不足
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-10-15 10:24:40 | 显示全部楼层
本帖最后由 jhq999 于 2021-10-15 10:26 编辑

为什么后来那些高级出现,一切为了开发效率,因为计算机硬件性能越来越高,不在主要考虑性能,如果现在的应用能够在十几、二十几年前的机子上运行,一百多秒算什么,都是以小时为单位的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-15 14:30:47 | 显示全部楼层
单论执行效率,C 是王者级,Python 不知道算不算废铁级。。但是每一门语言都有应用场景,C 更适合硬件驱动和操作系统底层,而 Python 更适合大数据分析,毕竟人们不可能既考虑代码的复杂性,也同时再去考虑业务场景的复杂性,那样估计只有天才才能玩编程了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-15 21:27:01 | 显示全部楼层
推荐你去读一读《黑客与画家》,下面是书中的摘录:

对于大多数程序,速度不是最关键的因素,所以你通常不需要费心考虑这种硬件层面上的微观管理。随着计算机速度越来越快,这一点已经越发明显了。
语言设计时,对实现方式少作限制还会使得程序具备更大的灵活性。语言的规格发生变化不仅是无法避免的,也是合理的。通过编译器的处理,按照以前规格开发的软件就会照常运行,这就提供了灵活性。
…………
一百年后的程序员最需要的编程语言就是可以让你毫不费力地写出程序第一版的编程语言,哪怕它的效率低下得惊人(至少按我们今天的眼光来看是如此)。他们会说,他们想要的就是很容易上手的编程语言。
效率低下的软件并不等于很烂的软件。一种让程序员做无用功的语言才真正称得上很烂。浪费程序员的时间而不是浪费机器的时间才是真正的无效率。随着计算机速度越来越快,这会变得越来越明显。


早期的编程语言追求速度,但是随着计算机运算速度的越来越快,很多时候代码的运行速度已经变得不那么重要,节约程序员的时间变得更重要。python的好处就是轮子多,如果拿来做科研,拿来做数据分析,不知道比C语言方便多少。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 15:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表