파이썬 성능을 개선하기 위한 6가지 프로젝트

‍한승운·2021년 3월 4일
0

python

목록 보기
7/13
  • 동일한 하드웨어에서 파이썬의 속도를 더 높이는 방법은 크게 2가지인데, 각각 장단점이 있다.

    • 파이썬에 사용되는 기본 런타임(C파이썬 구현)의 대안을 만드는 방법이다. 큰 작업이지만 결과적으로 C파이썬을 대체할 수 있다.
    • 기존 파이썬 코드를 다시 써서 특정 속도 최적화 기능을 활용할 수 있다. 즉, 프로그래머 측에서 더 많은 작업이 필요하지만 런타임을 변경할 필요는 없다.
  • CPU에 대한 의존도가 높은 프로세싱은 이 방법들을 사용해 속도를 높일 수 있다.

  • 넘파이를 사용하거나(계산), 다중 처리 확장을 사용하거나 외부 C 코드를 호출해서 느린 파이썬 속도의 근본 원인인 전역 인터프리터 잠금(GIL)을 피하는 방법이 있다

  • 하지만, 파이썬의 GIL에 대한 마땅한 대안은 아직 없으므로 누군가가 나서서 단기적인 해결책, 어쩌면 장기적인 해결책까지 마련해야 할 것 같다.

파이파이(PyPy)

  • C파이썬의 대안
  • 파이파이는 기존 파이썬 코드와의 호환성도 뛰어나므로 기본 런타임이 될 가능성도 가장 높다.
  • 언어의 속도를 높이기 위해 구글 크롬의 V8 자바스크립트 엔진과 마찬가지로 JIT(Just-In-Time) 컴파일을 사용
  • 제대로 된 성능 향상을 얻기 위해서는 어느 정도 워밍업 시간이 필요하므로 서버와 같은 장기 실행 프로그램에는 적합하지만 단발성 스크립트에서는 효과가 떨어진다는 점이다.
  • 실행 파일의 크기가 C파이썬에 비해 훨씬 더 크다.

피스톤(Pyston)

  • 피스톤 프로젝트는 드롭박스(Dropbox)에서 처음 시작됐지만 이후 다시 작성되어 재탄생
  • 파이파이와 마찬가지로 JIT를 사용해 파이썬 속도를 높인다.
  • C파이썬 코드를 프로젝트의 기반으로 사용하므로 기존 파이썬과의 기본적인 호환성이 높다.
  • 피스톤의 속도 향상 폭은 아직 크진 않지만(평균 약 20% 더 빠름) 아직 초기 단계의 프로젝트이므로 발전의 여지가 많다.

누이트카(Nuitka)

  • 파이썬 런타임을 대체하는 방법 대신 파이썬 런타임을 아예 버리고 기본 속도가 빠른 언어로 파이썬을 트랜스파일하는 방법을 택한 경우
  • 파이썬을 C++ 코드로 변환
  • C파이썬 런타임에서 필요한 모든 파일을 자동으로 패키징할 수도 있다. 누이트카의 장기적인 계획에 따르면, 향후 누이트카로 컴파일된 파이썬은 C 코드와 직접 연동해서 속도를 더 높일 수 있다.

사이썬(Cython)

  • 사이썬(파이썬용 C 확장)은 파이썬의 확대집합으로, C로 컴파일되고 C/C++ 코드와 연동한다.
  • 사이썬은 파이썬 함수, 그 중에서도 주로 계산을 수행하는 함수의 속도를 높이는 데도 사용할 수 있다. 단점은 독자적인 구문을 사용하기 때문에 기존 코드의 이식이 완전히 자동화되지 않는다는 점이다.
  • 기본 파이썬에는 없는 속도 측면의 여러 이점을 제공하는데, C 자체와 같은 가변 형식 지정도 이 가운데 하나다. 사이킷-런(Scikit-learn)을 비롯한 여러 파이썬용 과학 패키지는 이와 같은 사이썬 기능을 이용해 가볍고 빠르게 연산을 수행한다.

넘바(Numba)

  • 넘바는 앞서 언급한 두 접근법을 조합한다.

    • 사이썬과 마찬가지로 파이썬 언어에서 가장 필요한 부분(일반적으로 CPU 중심의 계산)의 속도를 높이며,
    • 파이파이 및 피스톤과 마찬가지로 JIT 컴파일을 사용한다.
  • 넘바로 컴파일된 함수는 데코레이터로 지정이 가능하며, 넘바는 넘파이와 함께 작동해서 발견된 함수의 속도를 높인다. 실제로 넘바는 넘파이와 같이 이미 친숙한 라이브러리와 함께 사용할 때 가장 효과적이다.

typed_python

  • typed_python은 강하게 형식이 지정되어 보유할 수 있는 형식이 제한되는 파이썬용 데이터 구조 모음을 제공
    • 예를 들어 정수만 받는 목록을 만들 수 있다. 이 방법을 사용하면 실행 속도가 더 빠르고 가능한 경우 프로세서의 병렬성을 활용하는 고도로 최적화된 코드를 생성할 수 있다.
  • 프로그램의 대부분을 일반적인 파이썬으로 작성하고, 특정 함수 내에서 typed_python을 사용해 연산 속도를 높일 수 있다. 사이썬을 사용해 애플리케이션에서 병목 지점이 될 수 있는 부분의 속도를 선택적으로 높이는 방법과 비슷하다.
profile
함께 성장하고 싶은 백엔드 개발자

0개의 댓글