본문 바로가기

Python

[Python documents] python3.11 속도

Why?

영어 공부도 할겸, 필요한 부분만 번역

서론

  • python3.11은 공식문서에 따르면, 10 ~ 65% 빨라졌다.
  • 일반적인 경우를 벤치마크한 결과 약 1.25배의 성능 향상을 보인다.

내용

측정 방법

  • Ubuntu Linux에서 GCC로 컴파일을 진행하여, pyperformance benchmark suite로 성능 측정 결과 Cpython3.10 보다 25% 빠르다.

Interpreter 실행이 빨라진 이유

python 3.10

python3.10의 경우 module을 실행할 때 다음과 같은 순서로 진행된다.
Read __pycache__ -> Unmarshal -> Heap allocated code object -> Evaluate

python 3.11

python3.11은 필수적인 코어 모듈들이 동결되었다. 이는 코드 객체(Code Object)와 bytecode가 정적으로 interpreter에 의해 할당된다.
그래서 python3.11은 python3.10에 비해서 module 실행 순서가 줄어들었다.
Statically allocated code object -> Evaluate

결론

그래서 interpreter 시작 속도가 10 ~ 15% 향상되었다.

  • 이로 인해서 짧은 코드가 큰 효과를 본다.

runtime이 빨라진 이유

python frames 비용이 줄었다.

python frames란 python의 실행정보를 담고 있는 것이다. python frames는 python 함수가 실행 될때마다 생성된다.

  • frame 생성 프로세스를 간소화 시켰다.
  • C stack에 쌓이는 frame 공간을 아낌없이 재사용해서, 메모리가 할당 되는 것을 방지했다.
  • 필수 정보만 포함하여, 내부 frame 구조를 간소화 했다.(기존에는 frame에 추가 디버깅 및 메모리 관리 정보가 있었다)

기존의 frame object는 debugger가 요청하거나, python introspection function(sys._getframe(), inspect.currentframe() 등)과 같은 함수가 요청하면 생성된다.
하지만, 대부분의 사용자가 작성하는 코드에서는 frame object가 전혀 생성되지 않는다.
그래서 결과적으로 거의 모든 python 함수 호출 속도가 상당히 향상되었다. 측정시 3 ~ 7% 속도가 빨라졌다.

inlined python function calls

python function이 호출 되는 동안에, python은 평가 C 함수를 호출하여 해당 함수를 코드를 해석한다. 이는 순수한 python 재귀를 C 스택에 안전하게 제한한다.

python3.11에서는 CPython이 다른 python 함수를 호출 하는 것을 감지하면, 새로운 프레임을 설정하고, 새 프레임의 새로운 코드로 이동한다.이 경우 C 해석 함수를 전부 호출하지 않아도 된다.

이제 대부분의 python 함수가 C Stack을 사용하지 않아서, 속도가 향상되었다. 피보나치 수열이나, 팩토리얼(!) 같은 단순 재귀적 함수는 1.7배 속도가 향상된 것을 관찰했다.

또한, 재귀 함수가 더 깊게 재귀할 수 있고(사용자가 sys.setrecursionlimit()으로 재귀 제한을 늘리는 경우), 1 ~ 3% 성능 향상이 되었다.