본문 바로가기
책 이야기/프로그래밍

고성능 파이썬 2판 (High Performance Python) - 미샤 고렐릭, 이안 오스발트 지음 / 오현석 옮김

by meticulousdev 2022. 4. 23.
반응형

1. 파이썬 성능 잠재력을 끌어내는 실용적인 개발 전략서

    고성능 파이썬의 부제는 "파이썬 성능 잠재력을 끌어내는 실용적인 개발 전략서"입니다. 이 부제는 책의 내용을 정확하게 설명합니다. 고성능 파이썬은 어떻게 하면 지금의 코드가 가지는 성능적 한계를 극복하고 성능을 극대화할 수 있는지에 대해서 체계적으로 담고 있습니다. 저는 이런 류의 책을 참 좋아합니다. 제목이 책의 내용을 정확하게 담고 있으며, 책을 읽고 난 후 책을 통해서 얻으려고 했던 것을 얻을 수 있는 책들 말입니다. 하지만 고성능 파이썬은 읽기 쉬운 책은 아닙니다. 비전공자 입장에서 컴퓨터 구조 및 기초 지식에 대해서 부족했던 부분은 따로 공부해야 했습니다. 쉽지 않은 코드들을 이해하기 위해서는 오랜 시간 동안 코드를 분석해야 했습니다. 그리고 버전이 변경됨에 따라서 책의 코드를 그대로 실행했지만 실행되지 않는 코드들을 해결하기 위해서는 구글의 도움이 필요했습니다. 그렇게 공부한 만큼 스터디를 시작하고 두 달 반의 시간 동안 공부하면서 정말 많은 것을 얻었습니다. 그리고 저는 이 책의 저자들에게 감사하다고 얘기하고 싶습니다.

 

2. 코드의 성능 향상을 위한 준비물

    책의 리뷰를 어떻게 쓸까 많은 고민을 했습니다. 그러다가 이 책의 내용은 제목, 부제, 그리고 목차에 이미 어떤 책인지 다 쓰여 있는데 굳이 다시 설명할 필요가 있을까 라는 생각을 하였습니다. 그래서 앞에서 책의 장점은 간단하게 이야기하고 그 후로는 책을 잘 활용하기 위한 준비물과 제가 가지고 있던 문제에 이 책이 어떻게 도움이 되었는지 소개해보려고 합니다.

1) 포기하지 않으려는 의지
2) 리눅스 운영체제의 컴퓨터
3) 저자의 깃허브 및 구글링

 

1) 포기 하지 않으려는 의지

    고성능 파이썬은 많이 어렵습니다. 스터디를 10명 정원으로 시작하였지만 마지막까지 완독한 사람은 딱 2명이었습니다. 읽는 도중에도 이해되지 않는 부분이 너무 많았습니다. 다 읽은 지금의 시점에서도 몇 개 챕터 말고는 이해했다고 말 못 하겠습니다. 그렇기 때문에 어렵더라도 포기하지 않고 끝까지 가보겠다는 의지가 필요합니다. 그래야 정독할 수 있는 책입니다.

 

2) 리눅스 운영체제의 컴퓨터

    저자는 리눅스 기반의 운영체제에서 코드를 실행하면서 책을 집필하였습니다. 그러다 보니 리눅스 운영체제에만 있는 명령어들을 사용하여서 결과를 보여줍니다. 예를 들어 perf 가 그렇습니다. perf는 리눅스 운영체제에서만 사용가능한 매우 강력한 프로파일링 도구입니다. 자세한 설명은 링크를 참고해주시기 바랍니다. 다시 돌아와서 책에서 소개된 명령어를 WSL에서 시도를 해보았으며, 가상 머신 위에서도 시도해보았습니다. 결국 둘 다 가상 머신이고 결과를 정상적으로 보여주지 않으며, 일부 명령어는 지원하지 않습니다. 7년 된 컴퓨터라도 리눅스 운영체제를 설치하고 거기서 실행결과를 확인할 때 책에 나온 방식들을 따라가기에 제일 좋았습니다.

 

3) 저자의 깃허브 및 구글링

    먼저 저자의 깃허브에서 책의 코드를 받으시는 것은 매우 중요합니다. 책의 일부 코드는 정상적으로 작동하지 않습니다. 그렇기 때문에 저자가 직접 실행했던 코드를 사용하는 게 제일 좋습니다. 그다음으로는 구글링입니다. 앞서 말했듯이 버전을 맞추려고 노력하더라도 일부 패키지들의 변경에 따라서 사용방법이 바뀌기도 합니다. 이렇게 바뀐 부분을 해결하기 위해서는 역시 구글링이 최고입니다.

 

이렇게 3개의 준비물이면 충분합니다. 꼭 책을 정독하실 필요는 없습니다. 책을 보시다가 본인의 문제 해결에 도움이 될 거 같은 부분을 펼치고 읽어보시고 적용하시면 됩니다.

 

3. 코드를 돌리고 맥주 한잔 하러 가면 되지

    코드의 규모가 커짐에 따라서 혹은 해결하려는 문제가 복잡해짐에 따라서 결과를 도출하기까지에 오랜 시간이 걸립니다. 제가 일하는 곳에서는 농담 삼아서 퇴근할 때 코드를 실행시키고 맥주 한잔 하고 내일 출근해서 결과를 확인한다고들 합니다. 저는 이 말을 별로 좋아하지 않았습니다. 정말 빅데이터를 다룰 경우 이런 상황이 이해가 갑니다. 하지만 제가 하는 일들은 그렇게 엄청난 규모의 데이터를 다루지도 않으며, 대용량의 연산이 필요하지도 않습니다. 그렇다면 코드를 잘 짜서 업무시간 이내에 결과를 볼 수 있게 하면 되지 않을까요? 결과가 잘 나왔다면 기쁜 마음으로 맥주를 마시고, 결과가 잘 나오지 않았다면 내일부터 파이팅 하자는 의미에서 맥주를 마시면 될일 입니다. 이러한 제 생각을 현실로 만들어 준 게 이 책입니다.

    짧지만 책의 소개가 끝났으니 제가 가지고 있었던 문제를 소개해보겠습니다. 그리고 해결 방법도 소개해보겠습니다.

 

1) 물질 A는 확산, 대류, 그리고 반응의 메커니즘에 따라서 농도가 바뀝니다.
2) 물질 A의 농도는 투입 이후 시간, 투입구로부터의 거리에 따라서 바뀌게 되며 미분방정식의 형태를 취합니다.
3) 미분방정식을 수치해석적으로 풀 경우 시간, 거리에 따른 물질 A의 농도를 알 수 있습니다.
4) 시간 간격과 거리 간격의 촘촘한 정도에 따라서 모델이 수렴하기도 하고 발산하기도 합니다. 
5) 모델의 수렴을 위해서 간격을 촘촘하게 만들면 연산 시간이 급격하게 증가한다는 문제가 있습니다. 
6) 여기서 끝나지 않고 이렇게 만들어진 모델의 민감도 분석을 위해서는 정해진 조건 내에서 수백 번의 연산이 필요합니다. 

 

여기까지가 제가 기존에 가지고 있던 문제입니다. 처음 전체 코드를 돌리려고 했을 때 연산이 끝나는 데 걸리는 시간은 25일이었습니다. 모델이 한번 돌아가는 데 대략 2,400초가 걸렸고 896번의 시뮬레이션이 필요했습니다 (2,400 (초/회) * 896 (회) / 86,400 (초/일) = 24.89 일). 맥주를 한달간 마셔야 가능한 수준입니다. 해결 방법은 생각보다 간단했습니다. 책에서 소개되는 numba를 적용하자 모든 문제가 해결되었습니다. 한번 돌아가는데 걸리는 시간은 4초가 되었고 모든 연산이 끝나는데 1시간이 걸리게 되었습니다. 처음 이걸 적용한 날은 컴퓨터 앞에서 절을 하였습니다. 

 

 

(2022.10.23. 추가) 앞서 언급한 연구 내용은 A multi-scale framework for modeling transport of microplastics during sand filtration: Bridging from pore to continuum (Journal of Hazardous Materials)에서 확인하실 수 있습니다.

 

4. 아쉬웠던 점은 적용할 곳이 많이 없었던 나의 상황들

    책을 정독하고 나서 아쉬웠던 점은 이 책에 나온 모든 기법들을 사용해볼 수 없는 제 상황이었습니다. 비동기 및 멀티프로세싱의 경우 말로만 듣던 기법이고 꼭 써보고 싶었습니다. 하지만 제가 일하는 분야에서는 써보기에 적합한 상황이 없습니다. 프로파일링 기법들은 심심할 때마다 써보고 있고 Cython의 경우 까먹을 거 같으면 한 번씩 사용해보고 있습니다. 그만큼 이 책에 소개된 기법들은 잊어버리기에는 아쉬운 것들 뿐입니다. 

 

5. 감사 글

    이 글은 생일 선물로 프로그래밍 책을 사준 박모군 덕분에 탄생한 글 입니다. 생일 선물 정말 감사합니다.

 

긴 글 읽어주셔서 감사합니다. 
글과 관련된 의견은 언제든지 환영입니다.
반응형

댓글