본문 바로가기
프로그래밍/Python

[Python] 파이썬 timeit으로 검색속도 비교하기

by wyatti 2023. 5. 10.

Python timeit 검색 속도를 비교하는 방법
Python timeit 검색 속도 비교

다른 Python 코드 스니펫 또는 함수의 속도를 비교할 때 timeit 모듈은 유용한 도구입니다. 이 모듈은 Python 코드의 작은 비트의 시간을 측정하고 실행하는 데 걸리는 시간을 결정하는 간단한 방법을 제공합니다.

 

'timeit' 모듈은 코드 스니펫을 일정 횟수 반복 실행하고 각 실행에 걸리는 시간을 측정하는 방식으로 작동합니다. 그런 다음 다른 코드 스니펫의 속도를 비교하는 데 사용할 수 있는 평균 소요 시간을 반환합니다.

 

timeit 모듈을 사용하는 몇 가지 방법이 있습니다. 한 가지 일반적인 방법은 timeit() 함수를 사용하는 것입니다. 이 함수는 두 개의 인수를 사용합니다: 시간이 지정된 코드 스니펫과 시간이 지정된 코드 전에 한 번 실행될 설정 문입니다. 예를 들어 간단한 목록 이해의 실행 시간을 측정하려면 다음 코드를 사용할 수 있습니다.

 

 

 

Python timeit 검색 속도를 비교하는 방법

 

다른 검색 알고리즘 비교

특정 문제를 해결하기 위해 두 가지 다른 검색 알고리즘을 구현했으며 성능을 비교하려고 한다고 가정합니다. timeit을 사용하여 각 알고리즘의 실행 시간을 측정하고 결과를 비교할 수 있습니다.

import timeit

def linear_search(lst, target):
    for i, val in enumerate(lst):
        if val == target:
            return i
    return -1

def binary_search(lst, target):
    low, high = 0, len(lst) - 1
    while low <= high:
        mid = (low + high) // 2
        if lst[mid] == target:
            return mid
        elif lst[mid] < target:
            low = mid + 1
        else:
            high = mid - 1
    return -1

lst = [i for i in range(100000)]
target = 99999

linear_time = timeit.timeit(lambda: linear_search(lst, target), number=100)
binary_time = timeit.timeit(lambda: binary_search(lst, target), number=100)

print("Linear search time:", linear_time)
print("Binary search time:", binary_time)

이 예제에는 선형 검색과 이진 검색이라는 두 가지 검색 알고리즘이 있습니다. 100,000개의 정수 목록을 만들고 목표값을 99999로 설정합니다. timeit을 사용하여 각 알고리즘을 100번 실행하여 실행 시간을 측정한 다음 결과를 인쇄합니다. 이렇게 하면 속도 측면에서 어떤 알고리즘이 더 잘 수행되는지 확인할 수 있습니다.

 

 

 

서로 다른 데이터 구조 비교

데이터를 저장하고 검색하는 두 가지 데이터 구조의 성능을 비교한다고 가정합니다. timeit항목 추가, 항목 액세스 및 항목 검색과 같은 일반적인 작업을 수행하는 데 걸리는 시간을 측정하는 데 사용할 수 있습니다.

import timeit

def list_test():
    lst = []
    for i in range(1000):
        lst.append(i)
    for i in range(1000):
        x = lst[i]

def set_test():
    s = set()
    for i in range(1000):
        s.add(i)
    for i in range(1000):
        x = i in s

list_time = timeit.timeit(lambda: list_test(), number=1000)
set_time = timeit.timeit(lambda: set_test(), number=1000)

print("List time:", list_time)
print("Set time:", set_time)

이 예제에는 목록과 집합이라는 두 가지 데이터 구조가 있습니다. 각 데이터 구조를 만들고 항목 추가 및 항목 액세스/검색의 두 가지 작업을 수행합니다. timeit각 작업을 1000번 실행하여 실행 시간을 측정한 다음 결과를 인쇄하는 데 사용합니다 . 이렇게 하면 속도 측면에서 어떤 데이터 구조가 더 나은 성능을 보이는지 확인할 수 있습니다.

결과

 

 

 

 

서로 다른 구현 비교

두 가지 다른 방식으로 동일한 알고리즘을 구현했으며 성능을 비교하려고 한다고 가정합니다. timeit각 구현의 실행 시간을 측정하고 결과를 비교하는 데 사용할 수 있습니다 .

import timeit

def implementation1(lst):
    result = []
    for i in lst:
        if i % 2 == 0:
            result.append(i)
    return result

def implementation2(lst):
    return [i for i in lst if i % 2 == 0]

lst = [i for i in range(100000)]

impl1_time = timeit.timeit(lambda: implementation1(lst), number=100)
impl2_time = timeit.timeit(lambda: implementation2(lst), number=100)

print("Implementation 1 time:", impl1_time)
print("Implementation 2 time:", impl2_time)

이 예제에는 목록에서 모든 짝수를 찾는 동일한 알고리즘의 두 가지 구현이 있습니다. 100,000개의 정수 목록을 만들고 timeit각 구현을 100번 실행하여 실행 시간을 측정한 다음 결과를 인쇄하는 데 사용합니다. 이렇게 하면 어떤 구현이 속도 면에서 더 나은지 확인할 수 있습니다.

결과

 

 

임의의 난수 검색

표준라이브러리인 ramdom 모둘의 randint()함수를 이용해서 0이상 9999이하의 임의의 난수를 생성 한 후에 0부터 9999까지 정수 만 개로 구성된 반복 자료형에 존재하는지 검색하는 함수이다. 이번 코드에선 if-in을 이용 해서 set, list, tuple를 비교해보는 코드를 작성해 보았습니다.

import timeit

search_test="""import random
x=random.randint(0, len(itr)-1)
if x in itr : 
    pass
"""
setTime = timeit.timeit(search_test,setup='itr = set(range(10000))',number=1000)
listTime = timeit.timeit(search_test,setup='itr = list(range(10000))',number=1000)
tupleTIme = timeit.timeit(search_test,setup='itr = tuple(range(10000))',number=1000)
print("setTime", setTime)
print("listTime", listTime)
print("tupleTime", tupleTIme)

위의 결과는 아래와 같이 나옵니다.

 

 

 

전반적으로 timeitPython의 다양한 알고리즘, 데이터 구조 또는 구현의 성능을 비교하는 데 유용한 도구입니다. 코드 스니펫의 실행 시간을 정확하고 효율적으로 측정할 수 있으므로 더 나은 성능을 위해 코드를 더 쉽게 최적화할 수 있습니다.

댓글