python try-except Performance Comparison

Python 으로 코드를 짜면서 가장 많이 고민하게 되는 내가 정말 Python 을 Python 답게 짜고 있는지가 고민입니다. C/C++ 로만 코드를 작성했기 때문에(아직 C++도 C 처럼 짜고 있는데…) 여러가지가 고민을 가지게 되는데, 가장 강하게 고민이 드는 것 중에 하나가 예외 처리입니다.

c++에서도 try, catch 를 제공하지만, 잘 쓰지 않기 때문에 이런 류의 예외처리에 익숙하지 않은데, Python 에서는 모든게 try-except 로 처리해야 하는 것 같더군요.

익숙하지 않은 상황에서는 return value 와 try-except 를 혼용하는 이상한 구조가 되버렸습니다. 그래서 코드를 다시 정리를 하려고 생각하는데, C/C++ 만 이용하던 초급 개발자라서, try-except 를 쓰면 성능상에 제약이 생기지 않을까 라는 생각이 들어서 간단한 코드로 비교를 해보았습니다.

테스트는 time 을 이용해서 비교했고, 각각 1000000 번 시도한 결과 값을 측정했습니다. 일단 간단히 결과부터 보여드리자면 다음과 같습니다. 결과부터 말씀드리자면, try-except 를 써도 전혀 속도에 영향이 없다입니다. 반복 루프에서 100% 예외가 발생하는 상황이 아니라면, 거의 영향이 없었습니다. 저도 만족해서 써도 될듯 하네요 ^^ 그래서 all-try.py 만 속도가 많이 느립니다.

DaeMyung-Kang-ui-MacBook-Pro:try-except-performance charsyam$ time ./no-try.py

real 0m0.657s
user 0m0.603s
sys 0m0.050s
DaeMyung-Kang-ui-MacBook-Pro:try-except-performance charsyam$ time ./use-try-but-not-call.py

real 0m0.683s
user 0m0.627s
sys 0m0.051s
DaeMyung-Kang-ui-MacBook-Pro:try-except-performance charsyam$ time ./use-try.py

real 0m0.681s
user 0m0.625s
sys 0m0.052s
DaeMyung-Kang-ui-MacBook-Pro:try-except-performance charsyam$ time ./all-try.py

real 0m2.031s
user 0m1.975s
sys 0m0.052s

그럼 비교 코드를 올리겠습니다. 혹시나 뭔가 비교를 잘못한거 같다면 저에게 알려주시면 감사하겠습니다.

no-try.py

from test_config import TEST_CONFIG

list = []
def add_list( num ):
    list.append(num)
    if( num == TEST_CONFIG.TRYCOUNT ):
        return

for i in range( TEST_CONFIG.RANGE ):
    add_list(i)

use-try-but-not-call.py

from test_config import TEST_CONFIG

list = []
def add_list( num ):
    list.append(num)
    if( num == TEST_CONFIG.TRYCOUNT ):
        return

for i in range( TEST_CONFIG.RANGE ):
    try:
        add_list(i)
    except:
        print i

use-try.py

from test_config import TEST_CONFIG

list = []
def add_list( num ):
    list.append(num)
    if( num == TEST_CONFIG.TRYCOUNT ):
        raise Exception("Exception")

for i in range( TEST_CONFIG.RANGE ):
    try:
        add_list(i)
    except:
        continue

all-try.py

from test_config import TEST_CONFIG

list = []
def add_list( num ):
    list.append(num)
    raise Exception("Exception")

for i in range( TEST_CONFIG.RANGE ):
    try:
        add_list(i)
    except:
        continue