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("
%f seconds
", duration); return 0; }

실행 결 과 는 0.05 초 이내 이 며, 파 이 썬 버 전 을 손 쉽게 썼 습 니 다. numba 를 추가 하려 고 시도 하면, 결 과 는 numba 를 추가 하지 않 는 것 보다 40 배 빠 를 것 입 니 다.
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("
totally 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.012696027557305 seconds 의 서로 다른 알고리즘 차이 가 매우 크다.
생각 보다 6 초 넘 었 어.하지만 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("
%f seconds
", duration); return 0; }

그리고 gcc - o is 사용prime is_prime. c 컴 파일 해 보 세 요. 실 행 된 결 과 는 0. 01520 seconds 입 니 다. 네, 아무래도 가장 빠 른 python 보다 10 배 빠 릅 니 다.사실 나 는 틀림없이 더 빠 른 알고리즘 이 있 을 것 이 라 고 믿는다.나중에 업데이트 할 게 요.

좋은 웹페이지 즐겨찾기