지금까지 python과 C의 연산속도, I/O 비교, python의 컴파일러 버전별 성능 비교를 해봤습니다.

그럼 다시 원래 목적으로 돌아가서, 왜 C보다 100배나 느린 python을 사용하는 걸까요?

다음은 처음에 사용했던 fibonacci 수열을 찾는 프로그램입니다.

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(35)
print 'Python Elapsed %.02f' % (time.time() - t)
 

python버전이고, 현재 제 PC에서 11초 정도가 걸립니다.
C로 짠 버전은 훨씬 빠르긴 하지만.. 35번째가 아니라 100번째라면 어마어마한 시간이 걸립니다.

하지만,

import time

previous = [1, 1]
def fibonacci(n):
    if len(previous) > n:
        return previous[n]
    else:
        new_value = fibonacci(n-1) + fibonacci(n-2)
        previous.append(new_value)
        return new_value
t = time.time()
print fibonacci(999)
print 'Python Elapsed %.02f' % (time.time() - t)
 

이 프로그램은 어떨까요?
999까지 구하도록 되어있지만, 0.0초에 끝납니다.
빠르다는 C도 아니고 python인데 말이죠.

그럼 이제 결론이 나오는것 같네요.

왜 C보다 훨씬 느린 python을 사용하는가?

같은 프로그램을 개발할때, 사용한 알고리즘에 따라 나오는 성능의 차이는 언어나 컴파일러의 차이를 뛰어넘을 정도로 클수도 있다고 생각합니다.

그렇다면 개발속도가 빠른 python을 사용해서 실제 코딩시간보다 프로그램에 대해 생각하는 시간을 늘리는건 어떨까요? 더 빠르고 안정적인 알고리즘으로 프로그램을 만들 수 있다면, C보다 더 효율적인 프로그래밍이 되지 않을까요?

솔직히 너무 뻔한 비교였습니다.
실제로 업무에서 fibonacci처럼 알고리즘에 따라 극적인 변화를 보이는 프로그램이 있을거라는 생각도 안들구요...

하지만, 개발속도의 차이와 프로그램의 구조와 알고리즘에 대한 더 많은 고민은 분명 더 좋은 프로그래밍으로 나아가는 발판이 될거라고 믿습니다. ^^;

신고
  1. Favicon of http://LazyDeveloper.net kkongchi 2007.02.28 14:25 신고

    실제로 특히 기업에서 사용하는 대규모 애플리케이션의 경우, 개발 생산성의 너무나 중요한 요소죠....글 잘 보고 갑니다. ^^

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

      감사합니다. ^^
      얼마전에 MS에서 세미나를 들은적이 있었는데,
      정말 언젠가는 개발자 없이 기획자만 남는게 아닌가 생각이 들 정도로 쉽게 생산할 수 있는 프레임웍들을 만들려고 하더군요.
      언젠가 밥 굶게 되는거 아닐까요? ;ㅂ;

  2. Favicon of http://moondding2.egloos.com/ moondding2 2008.03.14 21:29 신고

    절로~ 'Bravo'가 나오네요. ^-^

지난 글에서 피보나찌 수열을 이용해 Python과 C, Java의 간단한 성능 테스트를 해봤습니다.

생각보다 큰 차이에 놀라긴했지만, 실제로 업무에서 시간이 오래 걸리는 부분은 python의 연산 부분보다는 FILE I/O가 아닐까해서 다시 테스트를 해봤습니다.

먼저 간단히 python의 readline/writeline을 이용해 file을 읽고 쓰는 프로그램과
C로 fgets를 사용하는 프로그램을 만들어서 비교해봤습니다.

약 3배의 차이가 나는데... 아무래도 찜찜하더군요.

python의 readline이 확실히 더 많은 연산량을 가진 method이기 때문에 정확한 비교가 안되는것 같아서 python도 read(1)/write(1)만 사용하고 C도 fgetc만 사용해서 만들어봤습니다.

python : 평균 5.6초
C(fgetc) : 평균 5.1초
C(fgets) : 평균 1.8초

C가 약간 빠르긴 하지만 이정도 차이라면 굳이 python을 기피할 이유는 없어보입니다. :)

text file 10000개를 열어서 복사하는 테스트도 해봤는데, 역시 큰 차이는 없더군요.

역시 file I/O는 언어의 차이에 따라 큰 변화가 없는것 같아서 더이상 테스트를 해보지 않았습니다.


다음은 python compiler에 따른 성능을 비교해보겠습니다. ^^

컴파일러가 달라지면 같은 프로그램이라도 상당히 최적화 된다는 게 생각나서 python의 버전별로 같은 프로그램을 돌려봤습니다.

사용한 컴파일러는 윈도우용 python 2.3과 2.5 버전입니다.

10000개의 file을 readlines, writelines를 이용해 복사한 경우
2.5는 평균 79초, 2.3도 평균 79초 정도로 역시 file I/O의 경우 거의 같은 성능을 보여줬습니다.

그래서, 처음 C와 성능비교를 위해 사용했던 fibonacci 프로그램을 돌려봤습니다.

35까지 돌릴경우
2.5 : 평균 20초
2.3 : 평균 29초

40까지 돌릴경우
2.5 : 평균 215초
2.3 : 평균 315초

와, 이건 꽤 많은 차이가 나는군요! +_+
참고로, 리눅스용 python도 마찬가지로 2.5버전이 더 빨랐습니다.

300000까지 배열을 만드는 간단한 프로그램을 돌려봐도 2.5는 0.73초, 2.3은 1.48초로 확실히 다른 결과가 나왔습니다.

이거... 컴파일러의 차이가 생각보다 큰 결과로 나타나는군요.

하지만 파이썬을 사용하는 근본적인 이유는 뭘까요?
왜 C보다 100배 느린 python을 사용할까요?

다음 글에서는 제가 생각하는 python을 사용하는 이유를 적어보겠습니다. ^^

신고

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

티스토리 툴바