用shell和python3以及c语言,这三种语言编写一个求40万内素数的程序(同样的算法),测试shell、C、python的效率

本文通过对比C、Shell和Python3编程语言,展示了它们在求解40万以内素数时的效率差异。Python3耗时约4秒,Shell耗时约14.7分钟,而C语言仅需0.13秒。实验在单核虚拟机上的CentOS 7.5环境下进行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先是,python的脚本

[root@master2 test]# cat prime_num.py 
#!/usr/local/bin/python3
#coding:utf8

#导入统计时间模块
import time
#记录开始时间,用变量start保存
start = time.process_time()
#定义列表,用于保存素数,从2开始。
lst=[2]
for i in range(3,400000,2):
	for j in range(2,int(i**0.5)+1):
		if i%j == 0:
			break
	else:
		lst.append(i)
#记录结束时间
end = time.process_time()
#结束时间减去开始时间,等于deru
deru=end-start
#打印所有的素数
print(lst)
#打印用时
print("总共用时为:%f 秒"%deru)
#打印总的素数个数
print("素数的个数为:%d 个"%len(lst))

在linux(centos7.5中直接执行  ./prime_num.py 即可)

运行40万内的素数,耗时4秒左右

然后是shell的脚本:

[root@master2 test]# cat prime_num.sh 
#!/bin/bash
# File Name: prime_num.sh
# Author: 
# mail: 
# Created Time: Sun 12 Aug 2018 09:32:05 PM CST

#求40万内的素数,
#同样的算法,python的用时:3-4秒,GCC4.4版本下的c用时:0.12秒左右,,看下shell的速度如何
#先看下计算10000内素数的时间,初步估算为时间10000的时间*40倍;

begin=`date +%s`
array[0]=2
k=1
for i in `seq 3 2 10000`;do
	sqrt=`echo "sqrt($i)"|bc`
	let sqrt++
	for j in `seq 2 $sqrt`;do
		let mid=i%j
		if [[ $mid -eq 0 ]]; then
			break
		fi
		if [[ $j -eq $sqrt ]];then
			array[k]=$i
			let k++
		fi
	done
done
end=`date +%s`
let deru=end-begin;
echo ${array[@]}
echo "用时为:$deru 秒"
echo "1万内素数的个数为: ${#array[@]} 个"

在linux的shell中,直接执行: bash prime_num.sh

求1万内素数,耗时22秒( 40万内的素数粗略估计为22*40=880秒,大约为14.7分钟)

最后是C

[root@master2 test]# cat prime_number.c 
/*************************************************************************
    > File Name: prime_number.c
    > Author: Liwqiang
    > Mail: shrekee@qq.com 
    > Created Time: Sun 12 Aug 2018 09:54:07 PM CST
 ************************************************************************/

#include<stdio.h>
#include<math.h>
#include<time.h>
//#include<stdlib.h>
int i,j,k=1;
//初步定义n=40万,目的是计算40万内的素数的时间,结果很吃惊,在我的单核虚拟机中,只用了0.12秒
unsigned int n=400000;
int prime[40000];
//定义主函数
int main() {
	prime[0]=2;
	long start=clock();
	for(i=3;i<=n;i+=2){
		int	mid=sqrt(i);		
			for(j=2;j<= (mid+1);j++){
				if(i%j==0)
					break;
				if(j==(mid+1)){
					prime[k]=i;
					k++;
				}
			}

	}
	long end=clock();
	double duration = (double)(end - start) / CLOCKS_PER_SEC;
	for(i=0;i<k;i++){
		printf("%d ",prime[i]);}
	printf("\n");
	printf("总共耗时为: %f 秒\n在%d 个自然数中有%d 个素数\n",duration,n,k);
}

由于c是编译性语言,需要先编译为可执行程序,才可以执行:

在linux(centos7.5)的shell中,输入:gcc prime_number.c -o prime_num -lm

其中:gcc是linux的c编译器,-o:代表输出的文件路径 -lm :表示 使用math库

然后再当前路径下,执行 ./prime_num   (prime_num就是刚才生成的可执行文件)  

然后只用了0.13秒

3 399353 399379 399389 399391 399401 399403 399409 399433 399439 399473 399481 399491 399493 399499 399523 399527 399541 399557 399571 399577 399583 399587 399601 399613 399617 399643 399647 399667 399677 399689 399691 399719 399727 399731 399739 399757 399761 399769 399781 399787 399793 399851 399853 399871 399887 399899 399911 399913 399937 399941 399953 399979 399983 399989 
总共耗时为: 0.130000 秒
在400000 个自然数中有33860 个素数

 

最后的实验结果如下:

在我的一台单核虚拟机中,C   跑40万的素数耗时    0.13秒

                                         python3.6    跑40万素数   3.29秒

                        shell脚本只跑了1万内的数就用时       22秒

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值