[CPython] dict 접근 최적화: known hash를 활용한 중복 해시 계산 제거
PR 링크: python/cpython#146559 상태: Merged | 변경: +1555 / -1254
들어가며
Python에서 dict 접근은 가장 빈번한 연산 중 하나입니다. 변수 조회, 속성 접근, 모듈 import 등 거의 모든 곳에서 dict lookup이 발생합니다. 이 PR은 객체의 hash 값이 이미 알려진 경우, 중복 해시 계산을 건너뛰는 _BINARY_OP_SUBSCR_DICT_KNOWN_HASH 같은 새로운 UOP(micro-operation)를 추가하여 성능을 향상시킵니다.
핵심 코드 분석
1. 새로운 API 함수 추가
Before:
// pycore_dict.h
PyAPI_FUNC(int) _PyDict_SetItem_Take2(PyDictObject *op, PyObject *key, PyObject *value);
extern int _PyDict_GetItemRef_KnownHash(PyDictObject *op, PyObject *key,
Py_hash_t hash, PyObject **result);
After:
PyAPI_FUNC(int) _PyDict_SetItem_Take2(PyDictObject *op, PyObject *key, PyObject *value);
PyAPI_FUNC(int) _PyDict_SetItem_Take2_KnownHash(PyDictObject *op, PyObject *key,
PyObject *value, Py_hash_t hash);
PyAPI_FUNC(int) _PyDict_GetItemRef_KnownHash(PyDictObject *op, PyObject *key,
Py_hash_t hash, PyObject **result);
두 가지 변경이 있습니다:
_PyDict_SetItem_Take2_KnownHash함수 추가 - 이미 계산된 hash를 받아 dict에 항목을 설정합니다_PyDict_GetItemRef_KnownHash를extern에서PyAPI_FUNC으로 변경 - JIT 컴파일된 코드에서 호출할 수 있도록 export합니다
2. 새 UOP ID 등록
// pycore_uop_ids.h
#define _BINARY_OP_SUBSCR_DICT 315
#define _BINARY_OP_SUBSCR_DICT_KNOWN_HASH 316 // NEW
#define _BINARY_OP_SUBSCR_INIT_CALL 317
기존 _BINARY_OP_SUBSCR_DICT는 key의 hash를 매번 계산합니다. 새로운 _BINARY_OP_SUBSCR_DICT_KNOWN_HASH는 컴파일 타임에 hash가 확정된 경우(예: string literal key) 해시 계산을 완전히 생략합니다.
왜 이게 좋은가
- 핫 패스 최적화:
dict[key]연산은 Python 실행에서 가장 빈번한 연산입니다. hash 계산 제거는 사이클 수를 직접적으로 줄입니다. - JIT 친화적 설계: Known hash UOP는 JIT가 specialization할 수 있는 패턴을 제공합니다. 컴파일 타임에 hash 값을 operand로 임베딩할 수 있습니다.
- 하위 호환성 유지: 기존
_BINARY_OP_SUBSCR_DICT는 그대로 유지되며, known hash 변형은 옵티마이저가 조건이 맞을 때만 선택합니다.
정리
이 PR은 CPython의 dict 접근 경로에서 hash 값이 이미 알려진 경우 중복 계산을 제거하는 최적화입니다. 변경 규모(+1555/-1254)가 크지만, 핵심 아이디어는 단순합니다: 이미 아는 정보를 다시 계산하지 않는 것. JIT 컴파일러와 인터프리터 모두에서 dict 접근 성능이 향상됩니다.
참고 자료
이 포스트는 AI가 작성하였으며, 사실과 다를 수 있습니다. 정확한 정보는 원본 PR을 참고해 주세요.
관련 포스트
PR Analysis 의 다른글
- 이전글 [sglang] Qwen3.5 MoE 모델 로딩 및 Mamba 캐시 PP 모드 샤딩 수정
- 현재글 : [CPython] dict 접근 최적화: known hash를 활용한 중복 해시 계산 제거
- 다음글 [sglang] CI 테스트 최적화: MXFP8 Gemm에 오프라인 양자화 체크포인트 적용
댓글