파이썬에는 코드의 실행 시간을 측정해 줄 수 있는 timeit 이라는 라이브러리가 존재합니다.
timeit 은 python 기본 라이브러리로 2.7 버전부터 존재합니다.
timeit 공식문서: https://docs.python.org/ko/3/library/timeit.html
timeit 을 사용하는 가지 방법이 있습니다.
1. cli 를 이용한 실행
2. 코드에서의 실행
기본적으로 cli 에서 실행한 모습을 살펴봅시다.
python -m timeit '"-".join(str(n) for n in range(100))'
위 cli 의미는 '' 안에 있는 코드를 10,000 번 반복하라는 의미입니다.
(기본 반복 값은 10,000 번이다.)
이번에는 동일한 내용으로 코드에서 실행해봅시다.
import timeit
print(timeit.timeit('"-".join(str(n) for n in range(100))', number=10000))
지금까지는 함수 자체를 호출하는 것이 아닌 문자열에 특정 코드를 입력하는 방식으로 접근했습니다.
이번에는 직접 특정 부분을 호출하는 식으로 timeit 을 사용해봅시다.
import timeit
print(timeit.timeit(lambda: "-".join(map(str, range(100))), number=10000))
실전에 사용할 법한 예제를 가져왔습니다.
1 ~ 20,000 까지 요소를 가지고 있는 랜덤한 리스트가 랜덤한 개수만큼 안에 있다고 가정합시다.
# random_ints 의 길이가 100 혹은 150 혹은 랜덤한 갯수입니다.
random_ints = [1, 4, 7, 256, 222, 123, ...]
1 ~ 20,000 중 랜덤한 숫자 10개 를 고릅니다.
저는 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 으로 간단하게 예를 들겠습니다.
그러면 random_ints 에서 이 랜덤한 숫자 10개 중 겹치는게 어떤 것들이 있는지 알아내는 코드를 짜봅시다.
(코드 작성할 때는 랜덤 함수를 넣지 않고 정적으로 1 ~ 1000 으로 넣었습니다.)
import random
random_ints1 = [i for i in range(1, 20001)]
random_ints2 = [i for i in range(1, 11)]
together_has_int = []
for random_int2 in random_ints2:
if random_int2 in random_ints1:
together_has_int.append(random_int2)
print(together_has_int)
위와 같은 코드를 짤 수 있습니다.
저는 random_ints1 에 1 ~ 1000 개의 숫자를 생성했고, random_ints2 에 1 ~ 10 의 숫자를 생성했습니다.
이중에서 겹치는 요소를 together_has_int 라는 리스트에 넣기 위해 생성했습니다.
이런 코드도 짤 수 있지만 python 에 집합(set) 자료형을 이용할 수도 있습니다.
import random
random_ints1 = {i for i in range(1, 20001)}
random_ints2 = {i for i in range(1, 11)}
together_has_int = random_ints1 & random_ints2
print(together_has_int)
코드는 집합(set) 자료형으로 생성하니 더욱 가독성이 좋아보이네요
이중에 위에 코드가 더 빠를까요? 혹은 아래코드가 더 빠를까요??
이럴 때, timeit 을 사용할 수 있습니다!
import timeit
def test_list():
random_ints1 = [i for i in range(1, 20001)]
random_ints2 = [i for i in range(1, 11)]
together_has_int = []
for random_int2 in random_ints2:
if random_int2 in random_ints1:
together_has_int.append(random_int2)
return together_has_int
print('test_list', timeit.timeit(test_list, number=10000))
def test_set():
random_ints1 = {i for i in range(1, 20001)}
random_ints2 = {i for i in range(1, 11)}
together_has_int = random_ints1 & random_ints2
return together_has_int
print('test_set', timeit.timeit(test_set, number=10000))
놀랍도록!! 집합(set) 자료형을 이용한 케이스가 더욱 느렸습니다!
집합(set) 자료형은 요소가 많으면 시간이 더 늘어나는 게 보이네요!
1번째 시도
2번째 시도