본문으로 건너뛰기

[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);

두 가지 변경이 있습니다:

  1. _PyDict_SetItem_Take2_KnownHash 함수 추가 - 이미 계산된 hash를 받아 dict에 항목을 설정합니다
  2. _PyDict_GetItemRef_KnownHashextern에서 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 의 다른글