首先是,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秒