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.x의x에 물결 줄로 정확한 위치 표시. - TaskGroup, Exception Group(PEP 654) — asyncio 쓸 때 여러 예외 한 번에 처리 편함.
- tomllib 표준 라이브러리. pyproject.toml 읽을 때 외부 패키지 없이.
주의
C 확장 호환성. 일부 패키지는 재빌드 필요. numpy, pandas 등 주요 패키지는 이미 3.11 wheel 나왔다. 작게 쓰는 내부 C extension은 직접 ABI 확인 필요.
우리 메인 API는 async 비중 커서 25% 전체 개선은 아니지만 10~15% 정도는 체감될 것. 10월 정식 뜨면 바로 스테이지로 올릴 예정.