美文网首页
关于python的运行速度

关于python的运行速度

作者: 英武 | 来源:发表于2016-11-17 00:19 被阅读179次

    刚才看到了一个朋友发的关于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要快十倍。其实我相信肯定还是有更快的算法。待我以后再更新吧。

    相关文章

      网友评论

          本文标题:关于python的运行速度

          本文链接:https://www.haomeiwen.com/subject/nzfdpttx.html