회원가입

timeit 으로 파이썬 코드 실행 시간 확인

NULL 2022-10-03

파이썬에는 코드의 실행 시간을 측정해 줄 수 있는 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번째 시도

1 0