# 테스트 자료 만들기(5000부터 20000까지의 난수를 주가로 사용)
a = []
for i in range(0, n):
a.append(random.randint(5000, 20000))
# 느린 O(n * n) 알고리즘 테스트
start = time.time() # 계산 시작 직전 시각을 기억
mps = max_profit_slow(a) # 계산 수행
end = time.time() # 계산 시작 직후 시각을 기억
time_slow = end - start # 직후 시각에서 직전 시각을 빼면 계산에 걸린 시간
# 빠른 O(n) 알고리즘 테스트
start = time.time() # 계산 시작 직전 시각을 기억
mpf = max_profit_fast(a) # 계산 수행
end = time.time() # 계산 시작 직후 시각을 기억
time_fast = end - start # 직후 시각에서 직전 시각을 빼면 계산에 걸린 시간
# 결과 출력: 계산 결과
print(n, mps, mpf) # 입력 크기, 각각 알고리즘이 계산한 최대 수익 값(같아야 함)
# 결과 출력: 계산 시간 비교
m = 0 # 느린 알고리즘과 빠른 알고리즘의 수행 시간 비율을 저장할 변수
if time_fast > 0: # 컴퓨터 환경에 따라 빠른 알고리즘 시간이 0으로 측정될 수 있음
# 이럴 때는 0을 출력
m = time_slow / time_fast # 느린 알고리즘 시간 / 빠른 알고리즘 시간
# 입력 크기, 느린 알고리즘 수행 시간, 빠른 알고리즘 수행 시간, 계산 시간 차이
# %d는 정수 출력, %.5f는 소수점 다섯 자리까지 출력을 의미
print(”%d %.5f %.5f %.2f” % (n, time_slow, time_fast, m))
test(100)
test(10000)
# test(100000) # 수행 시간이 오래 걸리므로 일단 주석 처리
실행 결과
프로그램 18-3을 필자의 컴퓨터에서 실행해 본 결과는 표 18-2와 같습니다.
입력 크기 n |
최대 수익 |
느린 알고리즘 수행 시간 |
빠른 알고리즘 수행 시간 |
느린 알고리즘 시간 / 빠른 알고리즘 시간 |
100 |
14658 |
0.00061초 |
0.00002초 |
40.87 |
10000 |
14996 |
6.09124초 |
0.00167초 |
3653.97 |
100000 |
15000 |
819.66065초 |
0.01953초 |
41969.70 |
※ Intel i7 2.7Ghz, macOS 10.12.3, Python 3.6.0 환경에서 테스트한 결과
표 18-2 입력 크기에 따른 프로그램 18-3의 실행 결과