python을 공부하다가, 문득 ruby에 대해서 검색을 좀 하는 도중 재미있는 실험을 찾았어요.
(근데 왜 찾아가는 방향이 저 모양인지..;;)

사용자 삽입 이미지

각 언어의 성능비교표


http://www.timestretch.com/FractalBenchmark.html

ruby와 python, java, c 등의 성능을 비교해놓은 글이 있더군요.
강력하다는 말만 들었던 python이 저렇게 체면을 구겼을줄이야!!

그래서, 실험을 해봤습니다.

1. 먼저 저기에 나온 예제를 python, java, c로 돌려봤지요. 제가 테스트한 서버가 제온 4개가 꼽혀서 돌아가는 서버라서 그런지 저기 속도의 반에 끝내더군요.

 c : 0.06
 java : 0.204
 python : 6.15

그래도 결과는 c와 java가 거의 3배, c와 python이 거의 100배 차이가 나네요.

근데 테스트한 프로그램이 뭔지 이해가 되시나요?
이게 도대체 어떻게 짠 프로그램인가요? -_-a..
알수가 없어서 간단한 프로그램을 직접 짜서 비교해보기로 했습니다.

2. Fibonacci

간단한 fibonacci순열을 이용해 성능을 측정하기로 했습니다.
알고리즘은 다음과 같습니다. 쉽죠? ^^;

◇ C :

#include <stdio.h>

long fibo(n) {
    if (n == 0 || n ==1) {
        return 1;
    } else {
        return fibo(n-1) + fibo(n-2);
    }
}

int main(int argc, char *argv[]) {
    struct timeval {
        long tv_sec;
        long tv_usec;
    } aTv;
    gettimeofday(&aTv, NULL);
    long init_time = aTv.tv_sec;
    long init_usec = aTv.tv_usec;

    printf("%d\n", fibo(40));

    gettimeofday(&aTv,NULL);
    double query_time = (aTv.tv_sec - init_time) + (double)(aTv.tv_usec - init_usec)/1000000.0;
    printf ("C Elapsed: %0.2f\n", query_time);

}

◇ java :

import java.util.*;

class Fibonacci {
    private static long fibo(int n) {
        if (n == 0 || n == 1) {
            return 1;
        } else {
            return fibo(n-1) + fibo(n-2);
        }
    }

    public static void main(String args[]) {
        Date d1 = new Date();

        System.out.println(fibo(40));

        Date d2 = new Date();
        long diff = d2.getTime() - d1.getTime();
        System.out.println("Java Elapsed: " + diff/1000.0f);
    }
}

◇ python :

import time
def fibonacci (n):
    if n == 0 or n == 1:
      return 1
    else:
      return fibonacci(n-1) + fibonacci(n-2)
t = time.time()
print fibonacci(40)
print 'Python Elapsed %.02f' % (time.time() - t)

역시 python이 짧기는 합니다. 근데 C와 java도 시간체크하는 부분 빼면 뭐, 똑같죠.

그럼, 과연 성능이 어떨것이냐!!?

사용자 삽입 이미지

증명샷. 확실히 python은 느립니다;;


1. fibo(40)의 경우.
 c : 2.94
 java : 2.223
 python : 315.08

사용자 삽입 이미지

35의 경우


2. 35의 경우.
 C : 0.28
 java : 0.211
 python : 29.50

python은 역시 100배 느립니다;;; 근데 재미있는건 java가 더 빠르군요? 헤엣?!
위의 실험에서 java와 c가 10배의 성능차이를 낸것에 비해 이런 단순반복 재귀호출에서는 c와 java의 성능이 역전되는 걸까요? 좀 더 실험을 해봐야 할 문제인것 같군요.

일단 오늘의 주제였던 python과 C의 성능비교는 단순 반복 연산에서 100배 이상 차이가 난다고 결론을 내려도 될것 같습니다.
왜 단순한 연산에서 성능이 100배나 차이가 나는걸까요?
결국 기계어가 되어서 연산하는 cpu의 동작은 같을텐데 말이죠.
아마 script언어의 특성상 한줄한줄 바이너리 코드로 번역하는 부분에서 성능차이가 나는거겠죠?

단순 연산은 어차피 python의 강력함을 느낄수 없는 부분이라고 치고, 문자열의 연산이나 python은 그냥 사용가능하지만 C에서는 gmp library를 사용하는 큰 수들의 연산이 되면 어떨지 궁금합니다.

과연 개발시간 단축이라는 이점을 잡기 위해 100배 느린 python을 쓸것인가....

신고
  1. Favicon of http://www.coldcappuccino.com 식은카푸치노 2007.01.24 20:17 신고

    10ms 걸릴 작업이 1초 걸린다면 파이썬을 선택하고 100ms 걸릴 작업이 10초 걸린다면 C를 선택하겠습니다. ^^;

    • Favicon of http://hagun.tistory.com 하건 2007.01.24 22:50 신고

      오, 이사오고 제가 모르는 분께 받은 첫 답글이네요.
      성능을 요구하는 작업이 아니면 python을 쓰면 된다지만, 아무리 그래도 100배는 너무하잖아요? ^^;

  2. Favicon of http://blog.naver.com/nrzbn 이르 2007.02.02 16:25 신고

    지나가다 재밌어서 걸어봅니다 ^^

    • Favicon of http://hagun.tistory.com 하건 2007.02.02 16:56 신고

      이것 말고도 file I/O라던가 python의 버전별 비교도 많이 해봤는데요,
      아직 글로 정리를 못했네요. ^^;;

  3. Favicon of http://southgate.tistory.com 린호璘狐 2007.02.02 23:52 신고

    ^^ 안녕하세요; 꽤 재미있는 실험이네요..
    제가 생각하기엔 성능비교 실험에선 루프가 들어갔고, 피보나치에선 루프가 들어가지 않아서 C와 자바 비교 결과가 차이가 나는게 아닐까- 생각합니다. ^^;; 다른 비교도 궁금하네요~

  4. Favicon of http://sungdh86.egloos.com Ego君 2007.02.13 22:20 신고

    상황에 따라서 쓰는 곳이 다르지 않을까요?
    왠만한 가벼운 것은 Python을 쓰는 것이 효율적이겠고 좀 무거운 프로그램이면 C언어이고 등등
    재미있는 실험하셨네요^^

  5. 해수 2007.02.18 09:53 신고

    지나가다 궁금해서 질문드립니다.;;
    저는 프로그래밍을 거의모르고 관심만가지고있는학생입니다.
    파이썬 홈페이지에 들어가면 대문짝만하게 NASA uses python 이라고 써있는데..
    왜 나사는 100배나 느린걸 사용하는걸까요;; 나사같은곳은 속도가 중요할듯싶은데..;
    특별히 얻는 장점이 있는가요?

    • Favicon of http://hagun.tistory.com 하건 2007.03.02 16:37 신고

      늦었네요. ^^;
      python 성능비교 마지막 글을 참고하시면 될것 같습니다.
      python.org에 가서 글을 읽어봤는데, 역시나 생산성에 대한 이야기를 하는것 같네요. 관심있으시면 'NASA uses Python...' 아래의 그림 클릭해서 들어가서 읽어보세요.. ^^

  6. 장사장 2007.03.05 14:02 신고

    테스트 코드를 한번 바꿔서 테스트 해봐주세요~

    def fib(n):
    a, b = 0, 1
    for i in range(n):
    a, b = b, a + b
    return a

    이것으로요.
    동일한 피보나치 수열 함수이지만, 이게 더 pythonic code인 듯 해서요..

    • Favicon of http://hagun.tistory.com 하건 2007.03.05 17:33 신고

      그렇게 짜면 훠어어어얼씬 빠르겠죠?
      알고리즘 자체가 다르면 비교가 안되죠.
      C도 그런식으로 짜면 엄청나게 빠를테니까요.
      세번째 글에 결론이 있으니까 참고하세요. ^^

  7. 어느 불청객 2007.08.18 19:21 신고

    저 데스트의 두 가지 문제점을 지적하고 싶습니다.
    1. fibo(100) 구할 때 overflow 문제
    2. 재귀호출이 아닌 일반 for 반복문으로 계산 속도 비교하기
    재귀호출 만으로 계산 속도를 비교하는데는 무리가 있지 않을까요?

    참고:
    spigot 알고리즘으로 원주율(pi) 구하는 벤치마크
    http://shootout.alioth.debian.org/gp4sandbox/benchmark.php?test=pidigits&lang=all
    를 보시면 큰 정수 계산에서는
    Python 이 스크립팅 언어 중에 매우 빠르다는 것을 알 수 있습니다,

  8. Favicon of http://openjava.kr 지오아빠 2010.01.13 18:28 신고

    혹시나 해서 freeze 한 후에 성능 측정을 해봤는데 별반 차이가 없네용

  9. repairer5812 2010.03.27 22:05 신고

    지나가다 들려요. 저희 학교 교수님이 파이썬 회장이신데

    제가 수업을 들었거든요

    파이썬은 저런계산들은 무슨 모듈을 로딩해서 그쪽에 넣어서 돌린다고..

  10. 냠냠이 2011.07.13 09:34 신고

    파이썬 알고리즘에 문제가 있네요.

  11. 누군가 2012.04.14 22:15 신고

    python중에서 pypy라고 알고 계신가요
    python대비 최대 100배 빠르면서
    python 2.7.2를 대체할 정도로 호환성도 갖췄다고 합니다
    http://speed.pypy.org/ 가 비교표이고 다운받을 수 있는 곳은 http://www.pypy.org입니다

+ Recent posts

티스토리 툴바