코드 동작 실행 시간을 체크하는 데 사용한다. 가장 기본적인 생각은 코드가 실행된 순간부터 끝나는 순간을 체크하면 된다.
파이썬은 time이라는 라이브러리를 사용하면 쉽게 볼 수 있다.
import time
start = time.time() # 실행될 때 찍힌 시간
for i in range(10000000):
pass
end = time.time() # 실행될 때 찍힌 시간
print(f"{end - start}") # 정수부는 초단위, 소수부는 마이크로 초단위
출력
0.47263002395629883
time.time은 이 코드가 실행될 때 시작하는 시간이다. 그러니 시작과 끝에 이 코드를 적으면 얼마나 동작했는지 알 수 있다. 하지만 이런 코드에는 문제가 있다. 왜냐면 객관적인 시간이 아니기 때문이다. 컴퓨터의 스펙에 따라 다르게 나오기 때문에 객관적인 지표가 필요했다.
그래서 여러 방법이 나왔지만 가장 대표적인 BIg-O를 사용한다. 연산의 횟수를 기반으로 실행시간을 체크한다. 점근 표기법이라는 최고차 항의 차수만 고려하는 표기법을 이용하여 나타낸다. 최고 차 항만 고려하는 이유는 낮은 차수들은 비교적 무시할 수 있기 때문이다. 100,000,000+100 이면 100을 상대적으로 무시하는 것과 같다.
Big-O의 수학적 정의는 두 개의 함수 f(n)과 g(n)이 주어졌을 때, 모든 n >= n0에 대하여 절댓값(f(n)) <= c * 절댓값(g(n)) 을 만족하는 상수 c와 n0가 존재하면 f(n = O(g(n))이다. 함수의 상한을 표시한다.
예를 들어보자 n >=5 이면 2n+1 < 10n 이므로 2n+1 = O(n), (이때 c = 10, n0 = 5이다)
예시 가정
우리가 제곱을 해주는 코드를 만든다고 가정해보자 여러 방법이 있을 텐데 3가지 정도 예를 들어보며 시간 복잡도를 측정해보자.
척도는 대입(몇 번 입력해야 하나), 뎃셈, 곱셈, 나눗셈으로 평가한다.
예시 1
result = n*n
대입 : 1
덧셈 : 0
곱 : 1
나눗셈 : 0
합 : 2
시간 복잡도 : 2
예시 2
result = 0
for i in range(1, n+1):
result += n
대입 : n+1
덧셈 : n
곱셈 : 0
나눗셈 : 0
합 : 2n+1
시간 복잡도 : n
시간 복잡도는 n이다. 왜냐면 최고 차 항만 보기 때문이다.
예시 3
result = 0
for i in range(1, n+1):
for j in range(1, n+1):
result += 1
대입 : n*n+1
덧셈 : n*n
곱셈 : 0
나눗셈 : 0
합 : 2n**2+1
시간 복잡도 : n**2
얘가 시간 복잡도가 제일 높다. 이렇게 연산의 횟수에 기반하여 시간 복잡도를 측정하는데 제일 간단하고 작게 나올 수 있도록 해주는 게 알고리즘과 자료구조다.
'개발 Tools > 파이썬_개념' 카테고리의 다른 글
학습의 종류 (지도 학습, 비지도 학습, 강화 학습, 준지도 학습, 결정론적 학습, 스토캐스틱 학습) (0) | 2021.11.24 |
---|---|
차원의 저주 (Curse of Dimensionality) & 매니폴드 가정 (manifold assumption) (0) | 2021.11.24 |
파이썬 any, all (0) | 2021.10.17 |
파이썬 삼항 연산자, 맴버 연산자, 식별 연산자 (in, not in , is, is not) (0) | 2021.10.17 |
파이썬 집합(set) (삭제, 수정, 추가, 함축, 연산) (0) | 2021.09.17 |
댓글