关于python的运行速度

刚才看到了一个朋友发的关于Perl 6的运行速度的文章:http://www.jianshu.com/p/a6d67fb99247

感觉也是太慢了,找了一个c版本的同样程序:

#include 
#include 
#include 

int is_prime(int i)
{
    int j;
    for(j=2;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 
#include 
#include 
#include 

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要快十倍。其实我相信肯定还是有更快的算法。待我以后再更新吧。

你可能感兴趣的:(关于python的运行速度)