jin***
2021-05-24

자료구조별 특성부터 멀티코어·클러스터의 활용과 다양한 실무 노하우 등 ‘더 빠르고 확장성 있는 파이썬 개발에 필요한 고급 기법’을 다룬 책
고성능 파이썬 리뷰
이번에 리뷰해 볼 책은 High Performance Python 2판의 번역서인 고성능 파이썬: 파이썬 성능 잠재력을 끌어내는 실용적인 개발 전략서이다. 파이썬은 최근에 엄청나게 많이 쓰이고 있는 언어이다. 프로그래밍 언어 커뮤니티 인덱스인 TIOBE [1] 에 따르면, 이 리뷰를 작성하는 시점 (2021. 05) 기준, C언어에 이어 가장 많이 사용되는 언어 2위를 차지하고 있다. 많은 사람들이 파이썬을 만능 언어처럼 생각하는 경우가 많지만, 실제로 한계점 또한 명확한 언어이다. 실제로 리뷰를 쓰는 본인도 무분별하게 파이썬을 남용하여 프로젝트를 진행하다가 다시 처음부터 뒤집어 엎은 경우도 꽤 있었다. 그렇기 때문에, 이번 리뷰에 앞서서 파이썬의 인기 요인, 태생적 한계점을 배경지식으로 이야기 해보고자 한다. 그런 이후에, 이 책이 제시하는 방법들이 어떠한 파이썬의 한계점들을 완화하는지 보면서 이 책이 독자들에게 줄 수 있는 가치에 대해 이야기 하면 좋을 것 같다.
우선, 파이썬의 인기의 요인은 인터프리터 언어로써 초기 셋업과 학습이 매우 쉽고, 인터페이스 언어로써 다양한 DSL (Domain Specific Language) 들을 파이썬의 오픈소스 에코시스템에서 종합적으로 사용할 수 있게 하기 때문이라 생각한다. 그리고 파이썬이라는 호스트 언어를 통해 다양한 기술 스택들을 통합하여 결과물을 만들 수 있는 것이 가장 큰 장점이다. 예를 들어 머신러닝에 매우 널리 쓰이는 텐서플로우나 토치 등도 파이썬 API를 통해 쉽게 이용할 수 있으며, 웹 서비스를 위한 프레임워크 및 라이브러리들 역시 파이썬을 통하여 사용 가능하기 때문에, 매우 범용적으로 사용될 수 있다. 그렇기 때문에 일반적인 상황에서만 파이썬을 활용한다면, 파이썬이 거의 만능의 언어처럼 보일 것이다. 하지만, 항상 언급되는 파이썬의 한계점은 성능에 관련된 것이다. 단순히, 파이썬이 C보다 느려요 같은 1차원 적인 시각이 아닌, 파이썬의 언어적 특성으로 생기는 한계점들이 명확하게 존재한다. 대표적으로 예를 들면, 병렬 처리에서 병렬 처리에 의한 성능 향상이 아닌, 단순히 연산들의 동시성만 제공하며 실제 순차 처리와 성능이 같다거나, 실제 연산들에서 파이썬 오브젝트 관리를 위한 오버헤드로 인한 성능 저하등이 있다.
이 책에서는, 파이썬의 언어적 한계점을 어느정도 감추기 위한 방안으로, Chapter 3~5 에서 알고리즘/자료구조의 특성을 이용한 최적화, Chapter 7 에서 C 언어 바이너리를 파이썬에서 사용하여 성능 향상, Chapter 8 에서 비동기 I/O 통한 파이썬 런타임 성능 향상, Chapter 9 에서 Multiprocessing 을 통한 파이썬의 병렬 처리 한계점 완화, Chapter 10~11 에서 클러스터링과 메모리 사용에서 최적화 등을 소개하고 있다. 물론, 이책을 읽는 독자들이 성능향상을 하려는 환경에 따라, 챕터마다 중요성이 다르게 다가오겠지만, 개인적으로 Chapter 7~11 까지의 내용이 핵심적으로 느껴졌다. 컴파일된 C 언어 바이너리를 Python 인터페이스를 통해 이용할 수 있는 방법으로 CFFI, Cython, Ctypes 등이 존재하지만, 이 책에서는 Cython 을 소개하고 있다. 이 장을 통해 파이썬이 변수, 클래스 객체등을 어떻게 취급하는지, 그리고 파이썬의 편의성을 위해 희생하는 성능에 대해 독자들은 알게 될 것이다. 또한, Chapter 8 은 파이썬이 프로그램 런타임에서 작동을 해야할 부분과, 컴퓨터 시스템 I/O 에서 작업들을 위임하여 비동기 런타임으로 성능향상을 얻을 수 있는 부분에 대해 설명한다. Chapter 9 에서는 파이썬이 가지는 병렬 처리에서의 한계점을 극복하기 위한 Multiprocessing 을 소개하며, Chapter 10 으로 파이썬 클러스터의 구성, Chapter 11 에서 memory intensive 프로그램에서의 파이썬 최적화 방법을 소개한다.
각각의 챕터 내용들이 파이썬 언어의 디자인 철학/특성과 밀접하게 관련이 있어서, 단순히 이 책을 읽는 것 만으로 파이썬 내부에 대한 이해도를 많이 올릴 수 있다. 하지만, 일반적인 유저들은 실제로 이러한 한계점을 경험할 일이 많이 없기 때문에, 이 책의 대상 독자층은 파이썬으로 어느정도 성숙도 있는 프로젝트를 진행하는 개발자들이 될거라 생각한다. 또한, 이 책에서 소개하는 방법들은 파이썬의 한계점들을 '완화'하는 것이지 완전히 극복하는 것이 아니라는 점을 잊지 않았으면 좋겠다. 세상에는 다양한 프로그래밍 언어들이 존재하고, 이 언어들은 각자의 디자인 장/단점을 가진다. 그렇기 때문에 각각의 프로젝트 환경마다 적합한 언어들이 다르다. 많은 개발자들이 익숙한 언어를 기반으로 프로젝트를 진행하는 것을 선호한다. 또한, 언어의 익숙함때문에 프로젝트의 방향을 그에 맞게 바꾸기도 한다. 이 책을 통해 얻을 수 있는 또다른 교훈은, 단순히 파이썬의 성능 개선 방법의 학습뿐만 아니라 프로젝트의 기획 단계에서, 프로젝트를 성공적으로 이끌기 위한 다양한 고려 대상에 언어의 특성 역시 포함된다는 것을 알게되는 것이다. 단순히 쉽고 익숙한 언어를 좇는 것이 아닌, 자신이 사용하는 언어가 어떤 특성을 지니고 어떠한 프로젝트들에 적절한지 보다 더 성숙한 안목을 가지는데에 도움이 되는 책이라고 생각한다.
[1] TIOBE Index, https://www.tiobe.com/tiobe-index/
*한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다.