Python 딕셔너리 병합 방식 정리

문제 상황

설정 파일을 병합하는 유틸리티 함수를 작성하던 중, 딕셔너리 병합 방식이 여러 가지라는 것을 알게 되었다. 각각의 동작 방식과 성능 차이를 확인해봤다.

방법 1: update() 사용

가장 기본적인 방식이다. 원본을 변경하기 때문에 주의가 필요하다.

default_config = {'host': 'localhost', 'port': 8000}
user_config = {'port': 3000, 'debug': True}

config = default_config.copy()
config.update(user_config)
# {'host': 'localhost', 'port': 3000, 'debug': True}

방법 2: unpacking 사용 (Python 3.5+)

PEP 448에서 추가된 방식이다. 새 딕셔너리를 생성하므로 안전하고 가독성도 좋다.

config = {**default_config, **user_config}

방법 3: dict() 생성자

키워드 인자로만 병합 가능해서 제한적이다.

config = dict(default_config, **user_config)

성능 비교

timeit으로 간단히 측정해봤다. 1만 번 반복 기준:

  • update(): 0.0023초
  • {**d1, **d2}: 0.0031초
  • dict(): 0.0028초

update()가 가장 빠르지만 차이는 미미했다. 실무에서는 가독성을 우선해서 unpacking 방식을 선호하게 되었다.

결론

  • 불변성이 중요하다면: {**d1, **d2}
  • 성능이 critical하다면: update()
  • 대부분의 경우 unpacking이 적절했다.

Python 3.9에서는 | 연산자가 추가된다고 하니, 나중에 다시 정리해봐야겠다.