Python 딕셔너리 병합 시 성능 비교
문제 상황
마이크로서비스 아키텍처로 분리된 여러 API의 응답을 하나로 합쳐서 프론트엔드에 전달하는 작업을 진행했다. 각 서비스마다 반환하는 사용자 정보가 달라서 딕셔너리 병합이 빈번하게 발생했고, 처리량이 많아지자 성능 이슈가 생겼다.
병합 방법 비교
import time
# 테스트 데이터
dict1 = {f'key{i}': i for i in range(10000)}
dict2 = {f'key{i}': i*2 for i in range(5000, 15000)}
# 방법 1: update() 사용
start = time.time()
d1 = dict1.copy()
d1.update(dict2)
print(f"update: {time.time() - start:.4f}s")
# 방법 2: unpacking (Python 3.5+)
start = time.time()
d2 = {**dict1, **dict2}
print(f"unpacking: {time.time() - start:.4f}s")
# 방법 3: dict() + items()
start = time.time()
d3 = dict(list(dict1.items()) + list(dict2.items()))
print(f"items: {time.time() - start:.4f}s")
결과
1만 개 키 기준으로 측정한 결과 update()가 가장 빠르고, unpacking이 그 다음이었다. items() 방식은 리스트 생성 오버헤드 때문에 가장 느렸다.
적용
기존에 가독성 때문에 사용하던 unpacking 방식을 유지하되, 대용량 처리가 필요한 배치 작업에서는 update()를 사용하도록 변경했다. 응답 시간이 평균 15% 개선되었다.
def merge_user_data(base_data, *additional_data):
result = base_data.copy()
for data in additional_data:
result.update(data)
return result
Python 3.5의 unpacking 문법은 편리하지만, 성능이 중요한 부분에서는 전통적인 방법이 여전히 유효하다는 걸 확인했다.