15P by xguru 12일전 | favorite | 댓글과 토론
  • 파이썬 프로그램을 WebAssembly로 변환해주는 컴파일러
  • 인터프리터 오버헤드를 없애서 CPython(WASM) 보다는 3배 빠르게 동작
    • CPython(Native) 대비해서는 약 60% 속도임
  • Python을 WebAssembly에서 빠르게 실행하는 데는 여러 가지 방법이 있음
    • 성능이 좋은 코드로 컴파일될 수 있는 Python 부분 집합 사용 : CPython, RPython(PyPy) 및 Codon
    • Python 내부에서 JIT 사용 : PyPy
    • 정적 분석을 사용하여 생성된 코드 최적화 : mypy & mypy-c, Nuitka
  • 여기서 최종으로 파이썬 최적화 컴파일러인 Nuitka를 이용하기로 함

Nuitka

  • Nuitka는 프로그램이 수행하는 Python 호출을 내부 CPython API 호출을 사용하여 C로 변환하여 작동함
  • 대부분의 Python 프로그램을 지원하며, Python 코드를 해당 CPython 호출로 변환함
  • 코드 난독화기로도 작동할 수 있음(아무도 프로그램을 디컴파일할 수 없음!)
  • 모든 옵션을 깊이 분석한 결과, WebAssembly에서 Python을 실행하는 가장 빠른 방법은 아마도 Nuitka를 사용하는 것이라는 것을 깨달음

Nuitka를 사용하여 Python을 WebAssembly로 컴파일

  • Nuitka는 Python 코드를 기본 CPython 인터프리터 호출로 변환하는 대부분의 작업이 이미 완료되었기 때문에 WebAssembly 컨텍스트에서 Python 속도를 높이는 가장 쉬운 옵션인 것 같음
  • Nuitka는 아직 Python 3.12에서 작동하지 않으므로 Python을 3.11로 WASI에 재컴파일하고 생성된 libpython.a 아카이브를 사용해야 했음
  • 생성된 Wasm 파일을 실행하려고 하면 또 다른 문제가 있었어서, Nuitka에 변경 사항을 업스트림하기 위해 PR을 제출
  • 현재 py2wasm은 Nuitka의 포크를 사용하고 있지만, 변경 사항이 업스트림으로 통합되면 py2wasm을 Nuitka 위에 얇은 계층으로 만들 계획
  • Python 실행을 최대한 가속화해서 Python Django 백엔드를 Google Cloud에서 Wasmer Edge로 이동하는게 우리의 초기 요구사항이었음
  • py2wasm은 Python 백엔드 앱을 Edge에서 놀라운 성능으로 실행하는 데 한 걸음 더 가까워지게 해서, 현재 클라우드 제공업체보다 이러한 앱을 호스팅하기 위한 훨씬 저렴한 대안을 제공할 수 있게 도움을 줄 것

향후 로드맵

  • 향후 py2wasm을 Wasmer 패키지로 게시하여 다음 명령을 실행하기만 하면 실행할 수 있기를 바람
    wasmer run py2wasm --dir=. -- myfile.py -o myfile.wasm