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에서는 | 연산자가 추가된다고 하니, 나중에 다시 정리해봐야겠다.