융무의 기술블로그
article thumbnail
Published 2023. 3. 5. 21:00
python 컴파일 Data Engeneering/python

실무에 사용한 데이터 엔지니어링 스킬에 대한 정리내용입니다.

개인적인 기록을 위해 작성하였습니다.

https://github.com/mjs1995/muse-data-engineer/blob/main/doc/Programming%20Language/python_comfile.md

 

GitHub - mjs1995/muse-data-engineer: 데이터 엔지니어로 성장하기

데이터 엔지니어로 성장하기. Contribute to mjs1995/muse-data-engineer development by creating an account on GitHub.

github.com

 


C언어로 컴파일하기

  • 코드를 빠르게 하는 가장 쉬운 방법은 처리할 작업의 양을 줄이는 것입니다. 이미 최적의 알고리즘을 사용하며 처리해야 할 데이터를 간소화했다고 가정하면, 수행할 명령의 수를 줄이는 가장 쉬운 방법은 코드를 기계어로 컴파일하는 것입니다.
  • JIT 대 AOT 컴파일러
    • 미리 컴파일하는 방식이 AOT(ahead of time - 사이썬)와 적절한 때에 컴파일하는 방식인 JIT(Just in time(Numba, PyPy)
    • AOT 방식 : 사용할 컴퓨터에 특화된 정적 라이브러리를 생성합니다.
    • JIT 방식은 어떤 작업도 미리 하지 않고 컴파���러가 적절한 때에 컴파일을 시작합니다.즉 콜드 스타트에 문제가 있다는 뜻으로 프로그램 대부분이 컴파일되어야 하는데 아무것도 컴파일되지 않은 상태라면, 프로그램 실행 후에야 컴파일하느라 프로그램이 초반에 느리게 실행됩니다.
  • 순수 C기반의 컴파일을 수행하는 사이썬, LLVM 기반의 컴파일을 제공하는 Numba, 파이썬 가상 머신을 대체하는 내장 JIT 컴파일러를 포함하는 PyPy 등 여러 가지가 있습니다.
    • 사이썬 : C 언어로 컴파일하는 데 사용하는 가장 일반적인 도구로 numpy와 일반 파이썬 코드를 모두 커버합니다.(C 언어를 어느 정도 이해해야 합니다.)
    • Numba : numpy 코드에 특화된 새로운 컴파일러
    • PyPy : 일반 파이썬 실행환경을 대체하는 비 numpy 코드를 위한 JIT 컴파일러
  • 사이썬
    • https://ko.wikipedia.org/wiki/%EC%82%AC%EC%9D%B4%EC%8D%AC
    • 타입을 명시한 파이썬 코드를 컴파일된 확장 모듈로 변경해주는 컴파일러로 타입 어노테이션은 C와 유사한 형태
    • 다양한 사용성과 성숙도 그리고 OpenMP을 지원하는 점 때문에 주로 계산 코드의 속도를 빠르게 할 때 이 도구를 사용합니다.
    • OpenMP 표준과 사이썬을 사용하면 한 컴퓨터의 여러 CPU에서 실행할 수 있도록 병렬 처리 문제를 다중 처리를 고려한 모듈로 변경할 수 있습니다. 이 스레드는 파이썬 코드 수준이 아니라 사이썬이 생성한 C 코드 수준에서 동작합니다.
    • 한 컴퓨터에서 OpenMP를 사용해 병렬화하기
      • OpenMP(Open Multi-Processing)는 C, C++, 포트란에서 병렬 실행과 메모리 공유를 지원하는 잘 정의된 다중 플랫폼 API
      • 사이썬에서는 prange(병렬 범위) 연산자를 사용하고 setup.py에 -fopenmp 컴파일러 지시자를 넣어서 OpenMP를 추가할 수 있습니다.
      • prange 연산자는 GIL을 비활성화하므로 prange 상에서는 루프를 병렬로 수행할 수 있습니다.
  • Numba
    • 컨티넘 애널리틱스의 Numba는 numpy 코드에 특화된 JIT 컴파일러, 코드를 실행 시점에 LLVM 컴파일러로 컴파일합니다.
    • 미리 컴파일하는 단계가 필요 없으므로, 새로운 코드를 실행할 때마다 Numba가 여러분의 컴퓨터에 맞춰 어노테이션이 달린 각 함수를 컴파일합니다.
    • 집중해야 하는 함수를 알려주는 데커레이터를 제공하고, Numba가 그것을 이어받는다는 장점이 있습니다.
    • Numba는 외부 C 라이브러리와 연동하지 못하지만(사이썬은 연동 가능), 자동으로 GPU에 대한 코드를 생성할 수는 있습니다.(사이썬은 생성 불가)
    • Numbda의 단점 하나는 툴체인, LLVM을 사용하므로 의존관계가 복잡하며 새 환경에 Numba를 설치하려면 시간이 오래 걸리므로, 모든 것이 포함된 컨티넘의 아나콘다 배포판을 추천합니다.
  • PyPy
    • 추적형(tracing) JIT 컴파일러가 있는 또 다른 파이썬 언어 구현체로 PyPy는 파이썬 3.5 이상과 호환됩니다.
    • C파이썬을 완전히 대체할 수 있으며 모든 내장 모듈을 제공합니다. RPython 번역 도구와 그 도구로 만들어진 PyPy로 구성됩니다.(RPython으로 다른 인터프리터를 만들 수 있습니다.)
    • PyPy의 JIT 컴파일러는 매우 효율적이며, 그대로 사용하거나 약간의 작업만으로도 성능을 상당히 높일 수 있습니다.
    • PyPy가 모든 내장 모듈을 지원하며 PyPy에서도 multiprocessing이 작동한다는 뜻입니다.
  • 각 기술의 사용 시점
    • 컴파일러 선택 사항 요약
      특성 사이썬 Numba PyPY
      성숙함 Y Y Y
      널리 사용 중 Y - -
      numpy 지원 Y Y Y
      기존 코드를 깨지 않음 - Y Y
      C 언어 지식 필요 Y - -
      OpenMP 지원 Y Y -
      • Numba는 시간과 노력을 적게 들이고도 성능을 높이지만, 몇 가지 제약이 있어 여러분의 코드에서 잘 작동하지 않을 수 있습니다.
      • 사이썬은 보통 광범위한 문제에서 좋은 결과를 냅니다. 하지만 더 큰 노력을 들여야 하며 파이썬과 C 어노테이션을 혼용하기에 유지보수 비용도 커집니다.
      • numpy 등 포팅하기 어려운 C확장을 사용하지 않는다면 PyPy를 선택하는 편이 좋습니다.
      • 프로덕션 도구를 배포한다면 잘 알려진 도구를 사용하고 싶을 것으로 사이썬이 가장 좋은 선택입니다.
  • 떠오르는 다른 프로젝트들
    • PyData : 컴파일러 페이지에 고성능 및 컴파일러 도구 목록이 있습니다.
    • Pythran
      • numpy를 사용 중인 과학자를 위한 AOT 컴파일러로 소수의 어노테이션만 사용해서 파이선 수치 계산 코드를 더 빠른 바이너리 코드로 컴파일할 수 있습니다.
      • Pythran은 사이썬과 거의 비슷한 수준으로 속도를 높이지만, 해야 할 일은 훨씬 더 적습니다. Pythran은 GIL을 항상 해제하며 SIMD 명령어와 OpenMP를 모두 활용합니다.
      • Numba와 마찬가지로 Pythran은 클래스를 지원하지 않습니다.
    • Transonic
      • 사이썬, Pythran, Numba 등의 컴파일러를 통일한 단일 인터페이스를 제공합니다.
      • 코드를 재작성하지 않고도 여러 컴파일러를 빠르게 평가할 수 있습니다.
    • ShedSkin : 과학 계산이 아닌 순수 파이썬 코드를 목표로 만들어진 AOT 컴파일러로 numpy를 지원하지 않습니다.
    • PyCUDA, PyOpenCL : CUDA와 OpenCL 바인딩을 파이썬에 제공하여 직접 GPU에 접근할 수 있게 해 줍니다.
    • Nuitka : 일반적인 C파이썬 인터프리터의 대안으로 개발된 파이썬 컴파일러로, 컴파일한 실행 파일을 만드는 옵션을 제공합니다.

 


Reference

'Data Engeneering > python' 카테고리의 다른 글

python multiprocessing  (1) 2023.03.06
python Async  (0) 2023.03.05
python 프로파일링  (0) 2023.03.05
profile

융무의 기술블로그

@융무

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

article prev thumbnail

이전 글

python 프로파일링

2023.03.05

다음 글

python Async

2023.03.05

article next thumbnail