기본 콘텐츠로 건너뛰기

[python] try-except, if ~else, 내장모듈 밴치마킹(benchmarking)

이번에는 성능 테스트를 해보려고 한다.

에러를 발생을 시켜 catch부분에서 처리를 하는 방식과, 조건분기, 내장 모듈 사용이 얼마나 걸리는지 테스트를 하려고 한다.

똑같은 값이 얼마나 있는지 카운팅을 해주는 함수이다.

1
2
3
4
5
6
7
8
9
import time
def time_check(func):
    def new_func():
        start = time.time()
        func()
        result = time.time() - start
        print(result)
    return new_func
cs


우선 데코레이터로 만들어질 시간 체크 부분이다.

1
2
3
4
5
6
7
8
9
10
#키가 있는지 없는지 검사 후 카운팅
@time_check
def frequency_test1():
    Dictionary=dict()
    for i in range(10000):
        if i in Dictionary.keys():
            Dictionary[i]+=1
        else:
            Dictionary[i]=1
    return Dictionary
cs

1
2
3
4
5
6
7
8
9
10
#에러 발생후 카운팅
@time_check
def frequency_test2():
    Dictionary=dict()
    for i in range(10000):
        try:
            Dictionary[i]+=1
        except KeyError:
            Dictionary[i]=1
    return Dictionary
cs

1
2
3
4
5
6
7
8
#내장모듈 사용
@time_check
def frequency_test3():
    Dictionary = dict()
    for i in range(10000):
        Dictionary.setdefault(i, 1)
        Dictionary[i] += 1
    return Dictionary
cs

인자를 안넘기고 내부적으로 range를 통해서 테스트를 진행을 하고있다.

p.py
1
2
3
frequency_test1()
frequency_test2()
frequency_test3()
cs

$python p.py

0.002000093460083008
0.005000114440917969
0.002000093460083008
첫번째 방식에서는 Dictionary에서 지원을 해주는 keys라는 함수를 사용하여 확인을한다.

두번째로는 직접 해당키에 접근을 하여 += 1를 해준다 이때 해당 키가 존재하지 않는다면 에러를 발생을 시켜 except처리에서 =1을 해준다.

세번째 방식에서는 dictionary에서 지원해주는 setdefault를 이용을한다. 
setdefault는 첫번째 인자로는 키값이 들어간다. 해당 키가 없으면 두번째 인자로 key-value를 생성을 한다.

1
2
3
4
5
6
7
8
9
10
11
12
f1=[]
f2=[]
f3=[]
for i in range(500):
    f1.append(frequency_test1())
    f2.append(frequency_test2())
    f3.append(frequency_test3())
print(np.mean(f1))
print(np.mean(f2))
print(np.mean(f3))
cs

$python p.py

0.00164210510254
0.0032741765976
0.00217812395096

댓글