🚀Python JIT(Just-in_Time)컴파일러로 실행시간 최적화

아마 JIT에 대해 자바를 경험하셨던 분들은 이미 아시는 분들도 많으실 것입니다. 자바 역시 인터프리터 언어이고 성능 문제를 보완하기 위해 JIT컴파일러는 사용하고 있기 때문입니다. Python 또한, 인터프리터 언어로 코드를 한번에 한줄씩 읽어 실행하는 방식입니다. 매번 코드를 탑재하고, 기계어로 바꾸는 과정을 거치다보니 컴파일러를 사용하는 언어에 비해 실행속도가 느립니다. 하지만 소스코드를 바이트코드 형태로 컴파일하는 Just-In-Time 컴파일러를 이용하면 많은 개선효과를 얻을수 있습니다. 🚀 JIT컴파일러가 빠른 이유. JIT컴파일러는 같은 코드를 매번 해석하는게 아니라, 처음 실행될때 인터프리트 방식으로 기계어 코드를 생성하고,캐싱된 코드를 가져다 쓰기 때문에 인터프리터의 느린 실행 속도를 개선할 수 있습니다. (* 참고: JAVA의 경우 Method영역에 있는 코드 캐시(Code Cache) 공간에 JIT로 컴파일된 기계어 코드를 캐싱) 🕹 Python에서 JIT컴파일러는 사용하는 방법 Python에서도 JIT컴파일러는 사용할수 있는 대표적인 방법은 아래와 같습니다. ▶️ PyPy(https://www.pypy.org) ▶️ Numba(https://numba.pydata.org) ✅ PyPy (https://www.pypy.org/download.html) 파이썬의 기본 인터프리터인 CPython을 대체하는 구현체입니다. 현재는 3.9버전이 나와있으며, CPyhon3.7보다 약 4.9배 빠르다고 공식 홈페이지에 나와 있습니다. 사용방법은 pypy을 원하는 버전으로 다운받아 설치한 후에 코드를 작성하여 실행하던 방식인 python test.py >> pypy test.py 로 변경해서 사용하면 됩니다. 기존 Python에 비해 자주쓰는 코드를 캐싱해서 가지고 있기때문에 메모리를 많이 사용하고 여러 라이브러리와 호환성 문제에 대해 단점으로 많이 언급되네요 ✅ Numba(http://numba.pydata.org/numba-doc/latest/index.html) 이 라이브러리는 PyPy보다 고려할게 적고 사용하기 훨씬 간단합니다. numba를 requirments.txt에 추가, pip install을 통해서 설치를 하면되어 아주 편리합니다. Numba은 LLVM(Low Level Virtual Machine)컴파일러를 이용해, 수치 연산을 가속화해주며, 특히 Numpy코드 처리에 특화되어 있습니다. PyPy처럼 전체 코드에 대한 최적화를 해주지는 못하나, 조각 코드나 필요한 부분에 코드 최적화를 할때 유용합니다. numba를 import한후, 내가 최적화가 필요한 함수에 데코레이터로 @jit또는 @njit를 셋팅을 해주면됩니다. (*예시 코드 참조, 코드 실행시간은 스크린샷를 눌러서 보셔야 제대로 보입니다.) 단점이라면, 툴 체인으로, LLVM컴파일러를 사용하기에 의존관계에 존재합니다. 💡💡💡 사실 Python에서는 Cython을 이용한다던지, C,C++을 활용하는 등의 다양한 방법으로 실행시간을 최적화할수 있습니다. 하지만 이 방법들이 오늘 말씀드린 방법들보다는 사용하기 복잡하고 다소 번거롭기에 러닝커브가 있습니다. 하지만, PyPy은 코드 수정없이 속도 향상을 이룰수 있으며, Numba의 경우 단순히 데코레이터 추가만으로 성능향상을 이룰수 있습니다. 📚 Reference https://towardsdatascience.com/this-decorator-will-make-python-30-times-faster-715ca5a66d5f https://namu.wiki/w/JIT#fn-2 https://hongl.tistory.com/204 https://strawberry.report/python-code-optimization/ https://numba.pydata.org https://www.pypy.org

다음 내용이 궁금하다면?

또는

이미 회원이신가요?

2023년 3월 11일 오후 1:09

댓글 0