刚才看到了一个朋友发的关于Perl 6的运行速度的文章:http://www.jianshu.com/p/a6d67fb99247
感觉也是太慢了,找了一个c版本的同样程序:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int is_prime(int i)
{
int j;
for(j=2;j<i;j++)
if(i%j==0)
break;
if(j>=i)
return 1;
}
int main()
{
clock_t start, finish;
double duration;
int i;
start = clock();
for(i=2;i<=10000;i++)
{
if(is_prime(i)==1)
{
printf("%d\t",i);
}
}
finish = clock();
duration = (double)(finish - start) / CLOCKS_PER_SEC;
printf("\n%f seconds\n", duration);
return 0;
}
运行结果是在0.05秒以内,然后随手写了个Python的版本,尝试加上numba,结果速度会比不加上numba快四十倍:
import numba
import time
start = time.time()
@numba.jit
def primeNumber(start, end):
x = 0 #计数器
for i in range(start, end + 1):
result = True
for j in range(2, i-1):
if i % j == 0:
result = False
if result == True:
# print(i,end='\t')
x += 1
# if x % 10 == 0: #每10个打印一行
# print()
primeNumber(0,10000)
print("\ntotally take: {} second".format(time.time()-start))
一开始运行时间在0.32秒左右,运行几次之后,应该是内部系统做了优化,时间变为0.16秒左右。能不能更快呢?我相信肯定可以做得到,这就需要cuda了,但是本人当前使用的计算机是mac。
我觉得必须要承认,这个算法有很大的问题,而且我这样写的代码是很愚蠢的,下面重新写一个is_prime函数,来实现判断一个数字是否是质数。
import time
import math
start = time.time()
def is_prime(number):
if number > 1:
if number == 2:
return True
if number % 2 == 0:
return False
for current in range(3, int(math.sqrt(number) + 1), 2):
if number % current == 0:
return False
return True
return False
for i in range(10000):
if is_prime(i):
print(i)
print('totally took {} seconds'.format(time.time() - start))
呃,感觉厉害了,用时是0.012:
totally took 0.012696027755737305 seconds
不同的算法差异好大的。
想当初可是六秒多。但是如果在is_prime前面加上函数numba.jit试试看呢?
totally took 0.1609799861907959 seconds
时间又变成了0.16,反而拖累了程序的运行。这个还是有必要了解一下到底是哪里出了状况,也需要更进一步了解numba这个库和他的高级用法。
现在也有必要把c的算法也更新下:
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int is_prime(int i)
{
int j;
if(i > 1){
if(i == 2){
return 1;
}
if(i % 2 == 0){
return 0;
}
for(j = 3; j < sqrt(i); j++){
if(i%j==0){
return 0;
}
}
return 1;
}
return 0;
}
int main()
{
clock_t start, finish;
double duration;
int i;
start = clock();
for(i=2;i<=10000;i++)
{
if(is_prime(i)==1)
{
printf("%d\t",i);
}
}
finish = clock();
duration = (double)(finish - start) / CLOCKS_PER_SEC;
printf("\n%f seconds\n", duration);
return 0;
}
然后使用 gcc -o is_prime is_prime.c编译一下,运行得到的结果是:
0.001520 seconds
嗯,怎么着都是比最快的python要快十倍。其实我相信肯定还是有更快的算法。待我以后再更新吧。