Python에서 메모리 자료 구조는 신경을 크게 쓰지 않고 작업을 하게 되는 경우가 많다, 이렇다 보니 간단한 프로그램에서는 괜찮은데, 대용량을 처리하는 데이터 분석등에는 메모리 사용되는 방식에 따라서 성능 체감이 크게 느끼게 되었다. 여기에서는 2가지 크게 성능을 느꼈던 부분에 대해서 공유해본다.
1. List에서 찾기 사용시 {} 활용
List를 활용할때 in을 통해서 검색을 하는 경우는 자주 사용되는 방식이다.
그런데 List 구조체가 커지는 경우 [] 구조체는 속도가 급격하게 느려지게 된다.
이를 {}, Dict 형태의 구조체를 사용하면 속도를 획기적으로 개선할 수 있다.
아래는 테스트 코드이다.
import time
# 테스트 반복 횟수
N = 1_000_000_0
# 리스트 append 속도 측정
start_list = time.time()
lst = []
for i in range(N):
lst.append(i)
end_list = time.time()
list_time = end_list - start_list
# 결과 출력
print(f"리스트에 {N}개 항목 추가: {list_time:.6f}초")
start_search_list = time.time()
if 1999999 in lst:
print("리스트에 999999 항목가 있는는지 확인")
end_search_list = time.time()
search_list_time = end_search_list - start_search_list
print(f"리스트에서 999999 항목 찾기: {search_list_time:.6f}초")
# 딕셔너리 삽입 속도 측정
start_dict = time.time()
dct = {}
for i in range(N):
dct[i] = i
end_dict = time.time()
dict_time = end_dict - start_dict
print(f"딕셔너리에 {N}개 항목 삽입: {dict_time:.6f}초")
start_dict_search = time.time()
if 1999999 in dct:
print("딕셔너리에 999999 항목가 있는는지 확인")
end_dict_search = time.time()
dict_search_time = end_dict_search - start_dict_search
print(f"딕셔너리에서 999999 항목 찾기: {dict_search_time:.6f}초")
List와 Dict에 append를 통해서 아이템을 넣는데에는 크게 시간차이가 없지만, 값을 확인하는데는 큰 시간차이가 있는 것을 알 수 있다.
따라서 값이 있는지를 검색할때에는 Dict 구조를 사용하는게 효과적이다. Dict가 빠른 이유는 내부적으로 해쉬를 사용하기 때문에 검색시 해쉬를 통해 바로 검색을 진행하게 된다.
리스트에 10000000개 항목 추가: 1.052642초
리스트에 999999 항목가 있는는지 확인, 리스트에서 999999 항목 찾기: 0.013554초
딕셔너리에 10000000개 항목 삽입: 0.994148초
딕셔너리에 999999 항목가 있는는지 확인,딕셔너리에서 999999 항목 찾기: 0.000004초
2. List큐 관련
List를 활용해서 처리한 내용을 pop을 이용해서 제거하는 코드를 작성했다면 발생하는 문제로, List에서 pop을 진행하면, 기존 배열을 한칸씩 다시 이동시키기 때문에 상당한 처리 지연이 발생하게 된다.
하지만, collections의 deque는 별도의 인덱스를 가지고 있어서 인덱스만 제거하기 때문에 popleft를 이용하면 속도를 획기적으로 개선이 가능하다.
import time
from collections import deque
# 테스트할 요소 수
N = 100_000
# 리스트 준비
lst = list(range(N))
# 덱 준비
dq = deque(range(N))
# 리스트 pop(0) 성능 측정
start_list = time.time()
while lst:
lst.pop(0)
end_list = time.time()
list_time = end_list - start_list
# 덱 popleft 성능 측정
start_deque = time.time()
while dq:
dq.popleft()
end_deque = time.time()
deque_time = end_deque - start_deque
# 결과 출력
print(f"list.pop(0) 수행 시간: {list_time:.6f}초")
print(f"deque.popleft() 수행 시간: {deque_time:.6f}초")
위 코드의 수행결과는 다음과 같다.
list.pop(0) 수행 시간: 0.802761초
deque.popleft() 수행 시간: 0.008771초
마치며
Python에서도 속도를 개선할 수 있는 부분들이 많기 때문에 이러한 부분들을 찾아서 개선하면 보다 효율적인 프로그래밍이 가능해진다.
'Python' 카테고리의 다른 글
Python - Llama.cpp GPU로 Windows 에서 구동하기 (1) | 2025.07.31 |
---|---|
Python - FastAPI로 로컬 LLaMA 모델을 API 실행 (0) | 2025.07.30 |
LangChain 로더 종류 및 특징 (0) | 2025.07.28 |
BERT 모델을 이용해서 이상 문장 학습 및 탐지하기 (0) | 2025.04.16 |
Python - 내장 변수 관리 locals() (0) | 2025.04.09 |