Python을 위한 개선된 C API, HPy

3 weeks ago 6

  • HPy는 C로 Python을 확장하기 위한 새로운 API
  • #include <Python.h> 대신 #include <hpy.h>를 사용

HPy의 장점

  • CPython에서의 제로 오버헤드: HPy로 작성된 확장은 "일반" 확장과 동일한 속도로 실행됨
  • 대체 구현에서 더 빠름: PyPy, GraalPy 등에서 더 빠르게 실행됨
  • 범용 바이너리: HPy Universal ABI로 빌드된 확장은 CPython, PyPy, GraalPython 등에서 수정 없이 로드 가능함
  • 이전 C-API와의 혼합을 위한 마이그레이션 경로: 레거시 C-API 호출과 HPy API 호출을 혼합할 수 있음. 모든 코드가 마이그레이션되면 모든 CPython 버전, PyPy 또는 GraalPy에서 작동하는 범용 바이너리로 컴파일될 수 있음
  • 디버그 모드: 메모리 누수, 객체의 잘못된 수명, API의 잘못된 사용 등을 쉽게 식별 가능함
  • 더 나은 API: 표준 Python/C API의 한계를 극복하고, 더 일관성 있고, 더 나은 품질의 확장을 생성하며, 버그가 생기기 어렵게 설계됨
  • 진화 가능성: PEP 620에서 잘 요약된 바와 같이, 표준 Python/C API는 많은 내부 구현 세부사항을 노출하여 C API의 진화를 어렵게 함. HPy는 모든 내부 구현 세부사항을 숨겨 이러한 문제가 없음

현재 상태

  • HPy는 활발히 개발 중임. 0.9.0이 최신 알파 릴리스이지만 곧 알파 상태를 벗어날 것이며 안정적인 릴리스를 위해 노력하고 있음
  • HPy ABI가 이제 충분히 안정적이어서 다가오는 릴리스에서 이전 및 이후 이진 호환성 약속을 이행할 수 있다고 느낌
  • 중요한 패키지를 마이그레이션하기에 충분한 사용 사례를 API가 이제 다룰 수 있다고 생각함(특히 numpy 포트 확인)
  • 포팅 가이드와 광범위한 문서(특히 API 참조)도 제공함
  • 디자인 논의와 새로운 요구 사항에 대해 항상 열려 있음

HPy 호환 확장

  • ultrajson-hpy: HPy로 포팅된 첫 번째 실제 모듈
  • piconumpy: 이름에서 알 수 있듯이 사용자 정의 유형을 정의하는 최소한의 numpy와 유사한 모듈
  • numpy: 야심 찬 목표 중 하나는 numpy를 HPy로 포팅하고 이 경험을 사용하여 API 설계 방법을 더 잘 이해하는 것. 이 포트는 테스트 스위트를 통과하기 직전
  • matplotlib: NumPy에 대한 종속성도 있기 때문에 범용 모드로의 마이그레이션이 완전히 완료되지 않음. HPy에서 레거시 C API 함수를 계속 호출하고 테스트 스위트를 성공적으로 실행할 수 있도록 HPy는 레거시 호환성 API를 제공함
  • kiwi-solver: Matplotlib의 종속성으로 범용 모드로 완전히 포팅됨

GN⁺의 의견

  • HPy는 Python/C API의 한계를 극복하고 더 나은 확장성과 이식성을 제공하는 매우 유망한 프로젝트임
  • 특히 PyPy, GraalPy와 같은 대체 Python 구현에서 성능 향상의 잠재력이 크다는 점이 매력적임
  • 레거시 C API에서 마이그레이션하는 것이 어려울 수 있지만, HPy는 점진적인 마이그레이션 경로를 제공하여 이 과정을 훨씬 더 관리하기 쉽게 만듦
  • HPy를 채택할 때는 기존 빌드 시스템 및 배포 파이프라인과의 통합, 업스트림 프로젝트의 수용, 그리고 HPy 자체의 성숙도와 안정성을 고려해야 함
  • HPy와 유사한 목표를 가진 다른 프로젝트로는 Cython과 Rust의 PyO3 같은 것들이 있음. 이들은 저수준 C API 대신 고수준 언어를 사용한다는 점에서 HPy와 다름

Read Entire Article