융무의 기술블로그
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

융무의 기술블로그

@융무

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