서문
파이썬은 느린 언어입니다. 개발자가 타입 지정을 하지 않도록 하고, 메모리도 관리하지 않게 하며, 컴파일도 하지 않게 하는 대신 성능과 메모리 측면에서 많은 부분을 희생했습니다. 하지만 그러한 성능적인 이슈에도 불구하고 그 누구도 파이썬이 '좋지 않은' 언어라고 하지는 않을 것입니다. 성능을 약간 희생한 대신 생산성과 가독성, 그리고 편리함을 얻었기 때문입니다. 파이썬 덕분에 프로그래밍에 입문하여 개발을 시작하기도 하고 머신러닝과 딥러닝에 대한 접근성을 크게 높혀 누구나 데이터를 분석하고 인사이트를 얻을 수 있는 환경을 얻게 되었습니다.
하지만 개인적으로는, 정말 나이브하게 소스 코드를 작성한다면 그 어떤 프로그래밍 언어보다 느려질 수 있는 언어가 파이썬이라고 생각합니다. 특히 간단한 프로그램을 작성하다가 조금 더 복잡한 프로그래밍을 하는 경우에, 생각보다 느려진 나의 코드를 종종 마주하게 될 것입니다. 그리고 그 코드가 프로토타입이 아닌, 프로덕션 환경에서 작동하는 코드라면 발생하는 성능 이슈에 대응하기 위해 프로파일링을 하거나 다른 언어로 포팅할 것입니다. 이 책은 체계적이고 다양한 프로파일링 방법을 통해 파이썬의 성능을 극한으로 끌어내는 방법을 안내합니다. 그 뿐만 아니라 빅데이터 시대에서 파이썬을 통해 대용량 데이터를 다루고, RAM과 같은 한정된 리소스를 최소한으로 사용하기 위한 방법도 제시합니다. 개발을 하다가 파이썬 언어적 한계를 느껴보신 분들이라면 이 책을 읽어보시길 권장합니다.
이 책의 내용
고성능 파이썬은 컴퓨터 시스템에 대한 설명부터 시작합니다. CPU와 같은 연산장치의 특성과 RAM, 캐시 등의 메모리에 대한 설명, 그리고 통신 계층에 대한 설명을 하며 각 특성에 맞게 파이썬 코드를 최적화 하기 위한 전략을 언급합니다. 그 다음으로는 코드 프로파일링에 대한 설명과 활용 가능한 다양한 라이브러리들, 파이썬 자료구조의 특성, 비동기성, Multiprocessing 대해 다루는데, 읽으면서 다른 책들과 차별화 되는 두 가지 특징을 확인할 수 있었습니다.
첫 번째는 책이 굉장히 꼼꼼하다는 것이었습니다. 꼼꼼하다라는 표현은 다양하게 해석할 수 있지만, 제가 이 책에서 꼼꼼하다고 느낀 부분은 각 방법론들 마다 세세한 설명을 덧붙이고, 소스코드와 도표를 꼭 첨부한다는 점이었습니다. 논문을 자주 보는 대학원생의 특성 상 굉장히 추상적이고 두루뭉실한 글을 읽다가 보아서인지는 모르겠지만, 소스 코드 한줄 한줄이 내부에서 어떻게 동작하는지 설명해주며, 그걸로도 모자라 역어셈블 결과까지 보여줍니다. 그 덕분에 효율적인 코드와 비효율적인 코드의 차이점이 명확하게 와닿았고 독학하며 군데군데 비어있던 지식의 공간을 가득 채워주는 느낌을 받았습니다. 또한 도표와 소스코드가 매우 가독성이 높기 때문에 결과가 한눈에 들어오며 코드를 수도코드처럼 읽을 수 있었습니다.
두 번째는 과학적이고 체계적인 실험을 통해 성능 개선의 근거를 제시한다는 점이었습니다. 반복 실험은 물론이며, 코드를 변경했을 때 메모리 사용량의 변화, 소요시간, 향상된 정도 뿐 아니라 오차가 생길 수 있는 작은 오버헤드까지 설명하여 마치 바늘하나 들어갈 틈 없는 구성을 보여주었습니다. 저자가 물리학 박사 출신이라서 그런지 수치적 실험과 결과 분석에 많은 공을 쏟았다는 생각이 들었습니다. 아마 이 책을 읽으시는 분들도 저와 같은 생각을 하게 되실 것 같습니다.
그 외에도 프로파일링 챕터에서는 비효율적인 코드를 먼저 제시하고 점점 개선해 나가는 과정을 보여준다던가, 파이썬만의 자료구조는 다른 언어와의 비교를 한 후 진행하는 등의 챕터 별 구조도 짜임새 있게 구성되어, 몰입감 있게 읽는데 도움을 주었습니다.
아쉬운점
많은 좋은 내용들을 가지고 있지만 몇가지 아쉬운점도 보였습니다.(여기서부터는 매우 개인적인 의견이 들어가 있음을 밝힙니다.) 먼저 번역의 문제인데, 전반적으로 훌륭한 번역이라고 생각하지만 몇몇 부분에서 원서의 영문장이 어땠는지 유추가 되는 문장들이 있었습니다. 그리고 전반적으로 딱딱한 느낌의 문체를 가지고 있기에 기술서로서는 읽기 좋았지만, 장시간 읽는데에는 조금 지루했습니다. 그래서 전체적으로 한번 읽어본 후, 편독을 하는 것도 좋은 방법인 것 같습니다.
대상 독자
파이썬의 성능을 극한으로 내기 위한 최적화 방법들을 설명하기 떄문에 아마도 파이썬을 처음 접하거나 컴퓨터 공학적인 베이스가 부족하신 분, 수리적 분석에 약하신 분들은 읽기 어려우실 수 있습니다.
먼저 이 책을 읽기 전에 파이썬에 대한 기본문법을 당연히 이해해야 하고, 넘파이, 판다스, 사이파이 등의 라이브러리를 이용하여 자신이 원하는 기능을 파이썬을 통해 코드로 작성할 수 있으셔야 본 책의 내용을 따라갈 수 있습니다. 또한 이 책에는 메모리나 컴파일관련 내용들, 알고리즘 등 컴퓨터 공학적인 내용들도 다수 포함되어 있습니다. 이러한 내용들은 이미 알고 있다고 가정하는지 자세하게 설명을 하지 않습니다. 때문에 책을 읽으시면서 검색하고 공부하면서 읽다보면 아마 많은 것을 배우실 수 있을 것입니다. 마지막으로는 수리적인 내용인데, 생각보다 많은 수식들이 나옵니다. 그냥 넘어가셔도 크게 문제는 없지만 수식과 친하시다면 더 많은 내용을 가지고 가실 수 있을 것이라고 생각합니다.
추천합니다.
파이썬에 능숙하고 다음 레벨로 넘어가고 싶은 분
파이썬으로 대규모 개발을 진행하시는 분
파이썬의 성능적 한계를 느끼신 분
대용량 데이터 분석을 파이썬으로 하시는 분
추천하지 않습니다.
파이썬에 입문한지 얼마 되지 않으신 분
가볍게 파이썬에 대해 알고싶으신 분
사설
지난 달에 제가 작성한 코드가 한시간 넘게 동작해서 프로파일링을 진행한 적이 있습니다. 저는 코드 프로파일링을 거의 해본적이 없기 때문에 디버깅 모드를 켜고 한줄한줄 의심되는 코드를 돌려보기도 하고, 구글링을 통해 알게 된 cProfile을 통해 간단한 분석을 하기도 했습니다. 우여곡절 끝에 20여분까지 동작 시간을 줄인 후, 이 책을 읽게 되었는데, 프로파일링 챕터 가장 앞에 이러한 문장이 있더군요.
"프로파일링을 하지 않고 문제의 원인이라고 의심되는 코드를 수정할 수도 있다. 하지만 엉뚱한 코드를 고치는 일이 다반사임을 주의하자."
여러분들은 저같은 경험을 하지 않고 이 책을 미리 읽어보시고 프로파일링을 하여 좋은 코드를 작성하시면 좋겠습니다.
한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다.