parkj***
2016-09-02

파이썬은 느리다? 이 책은 파이썬의 단 하나의 약점, 성능 문제를 해결해주는 다양한 전략을 소개한다. 파이썬의 관점에서 바라보는 컴퓨터 아키텍처와 동작 원리를 기본으로 깔고, 각종 라이브러리의 올바른 활용법, 행렬과 벡터 연산 가속, 메모리를 효율적으로 쓰는 법, 병목을 찾는 습관과 도구, 네이티브 코드로 컴파일하기 등을 배우고, 파이썬을 성공적으로 도입한 업계 선배들의 경험담과 전략을 듣게 될 것이다. 특히 한국어판에서는 저자의 동의를 얻어 파이썬 2
파이썬을 사용하는 사람들에게 “왜 파이썬입니까?”라고 묻는다면, 십중팔구는 “쉬워서요”라고 대답합니다. 파이썬이 쉬울 수 있는 이유는, 프로그래머가 코드 이면에 숨겨져있는 복잡한 아키텍처들을 신경쓰지 않아도 어쨌든 ‘작동’하게 만들 수 있기 때문입니다.
그런데 이 책은, 사뭇 다른 시각으로 파이썬에 접근합니다. 파이썬의 ‘쉬움’에만 만족하지말고, ‘잘 써보자'는 것이죠.
따라서 그냥 ‘쉬워서’ 파이썬을 처음 접하신 분들에게는, 이 책이 처음엔 다소 어려울 수 있습니다.
이 책은 어셈블리 레벨 혹은 그 이하의 아키텍처의 흐름까지 아우르며 파이썬의 성능을 최적화하는 일에 몰두합니다.
기존에 C언어나 어셈블리 언어에 대한 배경지식을 가지고 계신 분이라면 굉장히 흥미롭게 이해하실 수 있을 것입니다.
(만약 이 책을 통해 파이썬을 '처음' 접하시는 분들이라면, 우선 다른책을 먼저 보시는게 좋겠어요 ^^;)
이 책은 먼저 파이썬의 성능 개선에 대해 논의하기 이전에, 기본적으로 숙지해야 할 컴퓨터 아키텍처에 대한 쉽고 가벼운 설명을 담고 있습니다. 컴퓨터공학에 대한 전반적인 배경지식이 없이 프로그래밍 관점으로만 업무를 진행해오신 분이라면 첫번째 챕터를 반드시 이해하실 필요가 있습니다. 이후 두 번째 장에서부터는, 병목 지점을 찾기위한 일명 '프로파일링'기법을 제시하며 본격적으로 성능향상을 위한 방법을 제시합니다. 컴퓨터 프로그래밍에서 ‘프로파일링(Profiling)’이란 프로그램의 시간 복잡도 및 공간(메모리) 복잡도, 함수 호출의 주기와 빈도등을 측정하여 프로그램의 성능을 분석하는 행위를 말합니다. 이번 챕터에서는 CPU, 메모리, 네트워크 대역폭, 디스크 I/O 등 다양한 측정기준을 제시하고, 이를 효율적으로 측정할 수 있는 도구를 알려줍니다.
제 생각에 저자인 미샤 고렐릭(Micha Gorelick)과 이안 오스발트(Ian Ozsvald)는 틀림없이 완벽주의자적인 성격의 소유자인 것 같습니다. 성능 프로파일링을 수행함에 있어서, 실험에 영향을 미칠 수 있는 다른 요소들(BIOS 의 터보부스트, CPU 온도, 배터리 사용, 백그라운드 작업 등)을 꼼꼼하게 나열한 후에, 실험 결과와 관련된 조건만을 유지하고, 나머지 요소들은 통제해야 한다는 것을 강조하고 있습니다.(일명 ‘변인통제’) 이렇게 꼼꼼하게 체크하면 반드시 성능상의 문제점이나 병목지점을 발견할 수밖에 없겠지요?
Ch. 3~6은 파이썬의 여러가지 자료구조들을 설명합니다. 이 부분을 읽으며 저는 개인적으로 큰 충격에 빠졌습니다. 파이썬을 쓰고 있었지만, 제가 쓰던 것은 파이썬이 아니라 그저 다른 언어(저의 경우에는 C)에서 사용했던 스타일을 계속 고집하며 진정한 파이썬의 묘미를 모르고 있었던 것이지요. 아아.. 저는 무지몽매한 프로그래머였습니다. 이 단원이 지향하는 목표는 결국 최적화의 관건은 데이터가 CPU로 전달되는 시간을 줄이는 것과, CPU가 처리해야 할 일의 양 자체를 줄이는 것으로 요약할 수 있겠습니다.
몇년전에 출판된 파이썬 관련 도서들을 보면, 파이썬을 선택하지 말아야 할 단점으로 '동시성 제어, 멀티 스레딩, CPU 처리, 병렬 연산 등이 좋지 않다' 라고 지적하고 있습니다.(참고 : Python for Data Analysis: Why not python?) 그런데!! 그로부터 몇년사이에 해당 단점이 새빨간 거짓말이 되어버렸습니다. 파이썬이 자신의 단점을 스스로 극복했기 때문입니다. 이는 오픈소스 커뮤니티의 위대함 덕분이며 이러한 선순환 덕분에 파이썬은 지금도 진화하고 있는것이 아닐까 합니다. 이와 관련한 내용을 Ch. 8~11에서 접하실 수 있습니다.
저는 그동안 '최적화를 하기위해서는 가독성을 포기해야 한다'는 편견이 있었습니다. 그런데 이 책의 저자는 가독성에 대해서도 분명히 강조를 합니다. 본인이 작성한 코드를 나중에 다른 개발자가 고칠 수 있고, 어떻게 동작하고 언제 동작하지 않는지를 쉽게 파악할 수 있도록 하는 노력을 수행해야 할 것입니다.