정보기술 ·
CPython 개발자 스프린트서 PyPy 전문가, "트레이싱 JIT 실전 경험 공유"...CPython JIT 성능 최적화 방향 제시
PyPy 최적화 7년 경력 전문가, CPython JIT의 실전 문제점과 해결 방향 발표
[한국정보기술신문] 지난주 영국 케임브리지에서 열린 CPython 핵심 개발자 스프린트에서 PyPy 전문가가 트레이싱 JIT(Just-In-Time) 컴파일러의 실전 활용 경험을 공유했다. ARM이 주최하고 Diego Russo가 주관한 이번 행사에는 약 50명의 핵심 개발자와 초청 인사들이 참여했다.
안토니오 쿠니(Antonio Cuni)는 고빈도 거래 기업에서 PyPy 최적화 작업을 7년간 수행한 경력을 바탕으로 'Tracing JIT and real world Python'이라는 제목의 발표를 진행했다. 그는 "실제 파이썬 코드를 트레이싱 JIT에 최적화한 경험을 가진 사람이 전 세계적으로 드물다"며 자신의 경험을 CPython 개발자들과 공유했다.
트레이싱 JIT의 근본적 한계 지적
쿠니는 발표에서 트레이싱 JIT의 세 가지 주요 문제점을 제시했다. 첫째는 '트레이스 차단' 현상이다. C로 작성된 확장 함수 호출 시 JIT가 내부를 추적할 수 없어 최적화 효과가 급격히 감소한다. 실제 테스트 결과 PyPy는 순수 파이썬 코드에서 CPython 대비 42배 빠른 성능을 보였지만, 추적 불가능한 함수 호출이 하나만 추가돼도 1.8배로 성능이 급락했다.
둘째는 '데이터 기반 제어 흐름' 문제다. 변수의 None 여부에 따라 다양한 경로가 생성되는 코드에서 JIT가 모든 조합을 개별 컴파일해야 하는 '지수적 폭발' 현상이 발생한다. 9개 변수의 경우 최대 512가지 조합이 가능해 오히려 JIT가 없는 버전보다 느려질 수 있다.
셋째는 제너레이터와 비동기 코드의 비효율성이다. 제너레이터는 프레임 객체를 생성해야 하므로 JIT가 효과적으로 최적화하기 어렵다. 테스트 결과 명시적 루프 대비 제너레이터 버전이 PyPy에서 더 느린 성능을 보였다.
CPython JIT, PyPy보다 불리한 구조
쿠니는 CPython JIT가 PyPy보다 불리한 구조를 가지고 있다고 지적했다. CPython JIT는 순수 파이썬 코드만 추적 가능한 반면, PyPy는 range, zip, enumerate 같은 내장 함수도 자동 추적한다. 현대 파이썬 개발에서 C 확장 사용이 불가피한 점을 고려하면 CPython JIT의 트레이스 차단 문제가 더욱 심각할 것으로 예상된다.
다만 긍정적 측면도 있다. CPython JIT는 워밍업 시간이 매우 짧아 짧은 프로그램에서도 효율적이다. 또한 쿠니는 '가상 객체' 최적화 기법을 통해 객체 지향 추상화의 오버헤드를 완전히 제거할 수 있음을 시연했다. 바이너리 데이터 처리 예제에서 객체 지향 방식이 CPython에서는 6배 느렸지만, PyPy에서는 오히려 더 빠른 결과를 보였다.
성능 예측 불가능성과 도구 필요성 강조
쿠니는 JIT 도입으로 성능 예측이 극도로 어려워진다고 경고했다. 코드 한 줄 수정이 관련 없어 보이는 다른 코드의 성능에 큰 영향을 미칠 수 있으며, 때로는 의도치 않게 2배에서 10배까지 느려질 수 있다. 그는 "좋은 프로파일러와 분석 도구가 필수적"이라며 CPython이 사용자들에게 JIT 동작을 이해할 수 있는 명확한 설명을 제공해야 한다고 강조했다.
이번 스프린트에서 쿠니는 JIT 논의 외에도 C API 개선을 위한 PyNI 프로젝트와 파이썬 REPL의 컬러풀한 자동완성 기능 추가 작업에도 참여했다. 그는 CPython JIT 팀과의 활발한 지식 교류를 통해 향후 CPython 성능 개선 방향에 기여했다고 밝혔다.
한국정보기술신문 정보기술분과 전호재 기자 news@kitpa.org