지금까지 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을 사용하는 이유를 적어보겠습니다. ^^

신고

+ Recent posts

티스토리 툴바