파이썬을 사용하는 사람들에게 “왜 파이썬입니까?”라고 묻는다면, 십중팔구는 “쉬워서요”라고 대답합니다.

파이썬이 쉬울 수 있는 이유는, 프로그래머가 코드 이면에 숨겨져있는 복잡한 아키텍처들을 신경쓰지 않아도 어쨌든 ‘작동’하게 만들 수 있기 때문입니다.


그런데 이 책은, 사뭇 다른 시각으로 파이썬에 접근합니다. 파이썬의 ‘쉬움’에만 만족하지말고, ‘잘 써보자'는 것이죠.

따라서 그냥 ‘쉬워서’ 파이썬을 처음 접하신 분들에게는, 이 책이 처음엔 다소 어려울 수 있습니다.


이 책은 어셈블리 레벨 혹은 그 이하의 아키텍처의 흐름까지 아우르며 파이썬의 성능을 최적화하는 일에 몰두합니다.

기존에 C언어나 어셈블리 언어에 대한 배경지식을 가지고 계신 분이라면 굉장히 흥미롭게 이해하실 수 있을 것입니다.

(만약 이 책을 통해 파이썬을 '처음' 접하시는 분들이라면, 우선 다른책을 먼저 보시는게 좋겠어요 ^^;)
참고 : 뇌를 자극하는 파이썬3, 처음 시작하는 파이썬, Head First Python 등



Ch. 1. 고성능을 위한 파이썬 이해하기

이 책의 첫 장에서는, 파이썬의 성능 개선에 대해 논의하기 이전에, 기본적으로 숙지해야 할 컴퓨터 아키텍처에 대한 쉽고 가벼운 설명을 담고 있습니다. 컴퓨터공학에 대한 전반적인 배경지식이 없이 프로그래밍 관점으로만 업무를 진행해오신 분이라면 이번 챕터를 반드시 이해하실 필요가 있습니다.


Ch. 2. 프로파일링으로 병목 지점 찾기

두번째 장에서부터는, 병목 지점을 찾기위한 일명 '프로파일링'기법을 제시하며 본격적으로 성능향상을 위한 방법을 제시합니다. 컴퓨터 프로그래밍에서 ‘프로파일링(Profiling)’이란 프로그램의 시간 복잡도 및 공간(메모리) 복잡도, 함수 호출의 주기와 빈도등을 측정하여 프로그램의 성능을 분석하는 행위를 말합니다. 이번 챕터에서는 CPU, 메모리, 네트워크 대역폭, 디스크 I/O 등 다양한 측정기준을 제시하고, 이를 효율적으로 측정할 수 있는 도구를 알려줍니다.


책에서 주로 사용하는 '쥘리아 집합(Julia Set)' 예제
책에서 주로 사용하는 '쥘리아 집합(Julia Set)' 예제

사실 일반적인 파이썬 코드를 다루는 상황에서는 이정도의 고난이도 분석이 무의미하다고 느껴질지도 모르겠습니다. 0.0001초나 0.000001초는 사실 굉장한 차이이긴합니다만, 사람이 체감하기에는 둘다 굉장히 빠른 찰나의 순간이기 때문입니다. 그래서 여기에서는 ‘쥘리아 집합(Julia set)’을 예제로 사용합니다. 쥘리아 집합은 고난이도의 복소수 연산을 동적으로 수행하기 때문에 실행시간이 꽤 길고, 예측하기가 어렵습니다. 이런 코드를 수행하면서 동시에 다양한 프로파일링 기법을 적용한다면, 어느 지점에서 확실히 느려지고, 어떻게 했을 때 분명하게 성능이 개선되었는지를 즉각적으로 깨달을 수 있습니다.


이 단원에서 제시하는 도구인 unix의 내장 time이나, cProfile 모듈을 통해 각 코드들이 수행될 때의 시간이나 호출횟수를 비교분석할 수 있습니다. 또한 dis 모듈같은 경우 파이썬의 바이트코드 레벨에서의 분석을 가능하게 하므로, 자신이 직접 구현한 함수가 내부적으로 어떤 역어셈블(disassemble) 결과를 생산해내는지를 보여줍니다. C++에서 STL같은 경우 느려서 잘 사용하지 않는다는 편견이 있는데, 파이썬에서도 비슷하게 내장함수로 제공되는 것들이 자신이 구현한 코드와 성능면에서 얼마나 차이가 나는지를 비교할 수도 있습니다.(이 책에서 예로 든 ‘수열의 합’문제는 내장함수를 사용하는 것이 이득인 것으로 나타남).


제 생각에 저자인 미샤 고렐릭(Micha Gorelick)과 이안 오스발트(Ian Ozsvald)는 틀림없이 완벽주의자적인 성격의 소유자인 것 같습니다. 성능 프로파일링을 수행함에 있어서, 실험에 영향을 미칠 수 있는 다른 요소들(BIOS 의 터보부스트, CPU 온도, 배터리 사용, 백그라운드 작업 등)을 꼼꼼하게 나열한 후에, 실험 결과와 관련된 조건만을 유지하고, 나머지 요소들은 통제해야 한다는 것을 강조하고 있습니다.(일명 ‘변인통제’) 이렇게 꼼꼼하게 체크하면 반드시 성능상의 문제점이나 병목지점을 발견할 수밖에 없겠지요?


Ch. 3~6. 파이썬의 여러 자료구조들

(리스트, 튜플, 사전, 셋, 이터레이터, 제너레이터, 행렬, 벡터)

이 단원을 읽으며 저는 개인적으로 큰 충격에 빠졌습니다. 파이썬을 쓰고 있었지만, 제가 쓰던 것은 파이썬이 아니라 그저 다른 언어(저의 경우에는 C)에서 사용했던 스타일을 계속 고집하며 진정한 파이썬의 묘미를 모르고 있었던 것이지요. 아아.. 저는 무지몽매한 프로그래머였습니다.

대부분의 프로그래밍 언어가 위와같은 루프를 사용한다면, 파이썬은 range나 xrange같은 함수를 도입하였습니다. 이를 통해 제너레이터(Generator)를 사용하는 프로그래밍 패러다임에 대한 통찰을 얻을 수 있었습니다.(Ch. 5 참고)

이것을 응용하면 아래와 같은 코드도 가능합니다.

여기에서 메모리 사용량까지 고려하여, 제너레이터를 사용하면 아래와 같이 한단계 더 최적화가 가능합니다.

이해가 되시나요? 위의 코드는 단 한줄만으로, 아주 많은 수의 리스트에서 3의 배수가 몇개인지 출력합니다. C 스타일로 구현했다면 모든 리스트를 순환하는 loop 속에서 3의 배수인지를 체크하는 과정을 매회 반복해야하겠지요? Ch. 6 에서 행렬과 벡터의 연산에 대한 설명에서도 일맥상통합니다. 결국 최적화의 관건은 데이터가 CPU로 전달되는 시간을 줄이는 것과, CPU가 처리해야 할 일의 양 자체를 줄이는 것으로 요약할 수 있겠습니다.


그런데, 저는 그동안 '최적화를 하기위해서는 가독성을 포기해야 한다'는 편견이 있었습니다. 그런데 이 책의 저자는 가독성에 대해서도 분명히 강조를 합니다. 본인이 작성한 코드를 나중에 다른 개발자가 고칠 수 있고, 어떻게 동작하고 언제 동작하지 않는지를 쉽게 파악할 수 있도록 하는 노력을 수행해야 합니다. 


Ch. 7. C언어로 컴파일하기

파이썬의 속도문제를 해결하기 위한 방안으로 Cython이 유명합니다. (참고 : http://cython.org/ ) 그리고 이는 이미 Python High Performance Programming(고성능 파이썬 프로그래밍, 에이콘 출판 역)이라는 책에서도 일부 언급하고 있습니다. 그러나 Cython 뿐만 아니라 다양한 기술들이 추가로 존재하며, 본 책에서는 그 주제들을 모두 다루고 각각의 장단점을 벤치마킹한 자료를 보여주고 있습니다. (205page 참고)

컴파일러 선택 사항 요약
컴파일러 선택 사항 요약

Ch. 8~11. 동시성 제어, 멀티프로세싱, 클러스터링, RAM

몇년전에 출판된 파이썬 관련 도서들을 보면, 파이썬을 선택하지 말아야 할 단점으로 '동시성 제어, 멀티 스레딩, CPU 처리, 병렬 연산 등이 좋지 않다' 라고 지적하고 있습니다.(참고 : Python for Data Analysis: Why not python?) 그런데!! 그로부터 몇년사이에 해당 단점이 새빨간 거짓말이 되어버렸습니다. 파이썬이 자신의 단점을 스스로 극복했기 때문입니다. 이는 오픈소스 커뮤니티의 위대함 덕분이라고 생각합니다. 오픈소스 개발자들은 스스로 사용자이기도 하기때문에, 사용하다가 불편한 지점에 맞닥뜨리면 서로서로 코드를 고치는 방식으로 기여를 합니다. 이러한 선순환 덕분에 파이썬은 지금도 진화하고 있는것이 아닐까 합니다.

저는 웹 크롤링을 수행하여 데이터베이스에 Insert하는 파이썬 프로그램을 작성한 적이 있습니다. 작업수행이 굉장히 느리길래 원래 db 처리가 느릴 수밖에 없구나..라고 생각했었는데, 알고보니 제가 파이썬을 쓸줄 몰랐던 것이더군요 ㅠ ㅠ 8.6절의 예제를 참고하시면 좋은 개선을 이루실 수 있습니다.


Ch. 12. 현장에서 얻는 교훈

마지막 챕터는 파이썬을 적극적으로 활용하고 있는 몇몇 기업의 대표자로부터 경험담을 인터뷰한 형식으로 이루어져 있습니다.


* 역자님들을 칭송하며

책을 읽으며 본문 하단에 실려있는 각주를 읽다보니, 역자이신 김영근님과 오현석님에 대한 경외감이 들었습니다. 그동안 다양한 전문서적을 읽어보면서 느꼈던 아쉬움은, 내용에 대한 이해없이 번역작업에만 치중하여 굉장히 난해하고 어색한 결과물이 나오는 사례를 많이 보았기 때문입니다. 그런데 이 책은 (약간의 과장을 보태서) 역자분들이 거의 새로운 책을 쓰셨다고 보아도 무방합니다. 왜냐하면 원서는 파이썬 2.7을 기준으로 집필되었으나, 한빛출판사에서 번역작업을 수행하며 출간할 때 전부 파이썬 3으로 수정하였기 때문입니다. 그 과정에서 모든 코드를 직접 작성하고 에러를 확인하며 파이썬 3으로 포팅작업을 완료하신 분들의 노고에 감사드립니다. 기술적인 부분 뿐만 아니라, 문화적 차이에서 기인한 다양한 미국식 아재개그(?)들에 대해 친절히 출처를 밝혀서 독자의 이해를 도와주셨고, 추가적으로 필요한 지식에 대해서 옮긴이의 설명과 참조링크를 제공해주셨습니다. 덕분에 참 좋은 책을 읽었던 것 같습니다. 

왼쪽은 영문 원서의 파이썬2.7코드, 오른쪽은 본 역서에 수록된 파이썬3 코드왼쪽은 영문 원서의 파이썬2.7코드, 오른쪽은 본 역서에 수록된 파이썬3 코드
왼쪽은 영문 원서의 파이썬2.7코드, 오른쪽은 본 역서에 수록된 파이썬3 코드

이 책을 통해 파이썬을 사용할 때에도 성능 프로파일링을 고려해야겠다는 생각이 들었으며, 파이썬3로 갈아타야겠다는 결심이 들었네요. 좋은책 추천드립니다.!


http://www.hanbit.co.kr/store/books/look.php?p_code=B6632668913




CPUU님의 창작활동을 응원하고 싶으세요?