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 문법은 편리하지만, 성능이 중요한 부분에서는 전통적인 방법이 여전히 유효하다는 걸 확인했다.