20220612

Python 3.11 속도 개선 벤치

3.11 beta3 나왔고 벤치 돌려봄. "Faster CPython" 프로젝트 결과가 공식 수치로 평균 25%라는데 실제 우리 코드에서 어떤지.

환경: macOS 12, M1 Pro, pyenv로 3.10.4 / 3.11.0b3 양쪽 설치. timeit으로 반복 측정.

테스트 1 — CPU 바운드 간단 루프

def sum_squares(n):
    s = 0
    for i in range(n):
        s += i * i
    return s

# n = 10_000_000
# 3.10: 0.93s
# 3.11: 0.67s  (약 28% 빠름)

테스트 2 — dict/tuple 많이 만들기

def rows(n):
    out = []
    for i in range(n):
        out.append({"id": i, "name": f"n{i}", "tags": (i, i*2)})
    return out

# n = 1_000_000
# 3.10: 1.32s
# 3.11: 0.91s  (약 31% 빠름)

테스트 3 — JSON 파싱

json.loads 1000회, 100KB 문서

  • 3.10: 0.88s
  • 3.11: 0.73s (약 17%)

테스트 4 — 예외 발생

3.11에서 많이 개선된 분야. try/except 거의 공짜.

def raise_catch(n):
    for i in range(n):
        try:
            raise ValueError
        except ValueError:
            pass

# n = 1_000_000
# 3.10: 0.56s
# 3.11: 0.22s  (약 60% 빠름)

기타 좋은 것

  • 에러 메시지가 훨씬 친절해짐. object.xx에 물결 줄로 정확한 위치 표시.
  • TaskGroup, Exception Group(PEP 654) — asyncio 쓸 때 여러 예외 한 번에 처리 편함.
  • tomllib 표준 라이브러리. pyproject.toml 읽을 때 외부 패키지 없이.

주의

C 확장 호환성. 일부 패키지는 재빌드 필요. numpy, pandas 등 주요 패키지는 이미 3.11 wheel 나왔다. 작게 쓰는 내부 C extension은 직접 ABI 확인 필요.

우리 메인 API는 async 비중 커서 25% 전체 개선은 아니지만 10~15% 정도는 체감될 것. 10월 정식 뜨면 바로 스테이지로 올릴 예정.