KAGAKU GIJYUTSU KEISAN NO TAME NO Python NYUMON by Kenji Nakakuki Copyright c 2016 Kenji Nakakuki All rights reserved. Original Japanese edition published by Gijyutsu-Hyoron Co., Ltd., Tokyo This korean language edition published by arrangement with Gijyutsu-Hyoron Co., Ltd., Tokyo in care of Tuttle-Mori Agency, Inc., Tokyo through Danny Hong Agency, Seoul Korean translation copyright c 2017 by J-PUB 이책의한국어판저작권은에이전시원을통해저작권자와의독점계약으로제이펍출판사에있습니다. 신저작권법에의해한국내에서보호를받는저작물이므로무단전재와무단복제를금합니다. 초판 1 쇄발행 2017 년 11 월 30 일 지은이나카쿠키켄지 옮긴이심효섭 펴낸이장성두 펴낸곳제이펍 출판신고 2009 년 11 월 10 일제 406-2009 - 000087 호 주소경기도파주시회동길 159 3 층 3-B 호 전화 070-8201 - 9010 / 팩스 02-6280 - 0405 홈페이지 www.jpub.kr / 원고투고 jeipub@gmail.com 독자문의 readers.jpub@gmail.com / 교재문의 jeipubmarketer@gmail.com 편집부이민숙, 황혜나, 이슬, 이주원 / 소통 기획팀민지환 / 회계팀김유미 교정 교열홍성신 / 본문디자인이민숙 / 표지디자인미디어픽스 용지에스에이치코리아 / 인쇄한승인쇄사 / 제본광우제책사 ISBN 979-11 - 88621-02 - 6 (93000) 값 28,000 원 이책은저작권법에따라보호를받는저작물이므로무단전재와무단복제를금지하며, 이책내용의전부또는일부를이용하려면반드시저작권자와제이펍의서면동의를받아야합니다. 잘못된책은구입하신서점에서바꾸어드립니다. 제이펍은독자여러분의아이디어와원고투고를기다리고있습니다. 책으로펴내고자하는아이디어나원고가있으신 분께서는책의간단한개요와차례, 구성과저 ( 역 ) 자약력등을메일로보내주세요. jeipub@gmail.com
드리는말씀 이책에기재된내용을기반으로한운용결과에대해저자, 역자, 소프트웨어개발자및제공자, 제이펍출판사는일체의책임을지지않으므로양해바랍니다. 이책에등장하는각회사명, 제품명은일반적으로각회사의등록상표또는상표입니다. 본문중에는 TM, C, R 마크등이표시되어있지않습니다. 이책에서사용하고있는제품버전은독자의학습시점이나환경에따라책의내용과다를수있습니다. 본문중일본내의실정에만국한되어있는내용이나그림은일부를삭제하거나국내실정에맞도록변경했으 니참고바랍니다. 책내용과관련된문의사항은옮긴이나출판사로연락주시기바랍니다. - 옮긴이 : flourscent@gmail.com - 출판사 : readers.jpub@gmail.com
차례 xv xvii xx xxiii CHAPTER 1 과학기술컴퓨팅과파이썬 1 1.1 데이터로살펴보는파이썬의현재 3 1.1.1 1.1.2 1.1.3 1.2 파이썬기초지식 8 1.2.1 1.2.2 ❶ 가독성과유지보수성 10 ❷ 인터프리터언어 10 ❸ 스크립트언어 10 ❹ 접착제언어 11 ❺ 배터리내장 11 ❻ 풍부한생태계 12 column _13 1.2.3 1.2.4 2 x 3 x 1.3 과학기술컴퓨팅과파이썬의관계 17 1.3.1 17 파이썬의보급도 18 쉬운사용 18 1.3.2 18 1.3.3 SciPy Stack 21 민간기업과커뮤니티 22 파이썬의활용사례 24 1.3.4 24 성능비교의세부사항 26 column _29 1.4 정리 31 3 6 7 8 9 14 14 차례 v
CHAPTER 2 제로부터시작하는시뮬레이터개발 33 2.1 시뮬레이터설계하기 35 2.1.1 PyRockSim 2.1.2 2.1.3 2.2 기능분할과파일분할 37 2.2.1 37 기능구현시유의할점 39 2.2.2 import 39 2.3 프로그램작성 40 2.3.1 2.3.2 import 2.3.3 2.3.4 2.3.5 2.3.6 2.4 정적코드분석 50 2.4.1 2.4.2 2.5 단위테스트 52 2.5.1 2.5.2 2.5.3 doctest 2.5.4 unittest 2.5.5 nose 2.6 디버깅 61 2.6.1 pdb 2.6.2 pdb 2.6.3 pdb 2.7 프로그램의최적화 67 2.7.1 2.7.2 2.7.3 2.8 정리 73 35 36 36 40 40 41 42 45 48 50 51 52 53 54 57 59 61 61 63 67 69 72 CHAPTER 3 IPython 과 Spyder 75 3.1 IPython 77 3.1.1 IPython 3.1.2 IPython column Jupyter_80 3.1.3 Jupyter Notebook 3.1.4 IPython 77 79 80 82 vi 차례
객체의내용을확인하기 83 함수의내용표시하기 84 함수의내용을자세히표시하기 85 객체를이름으로검색하기 85 매직커맨드 86 운영체제와의연계 88 명령히스토리확인하기 89 히스토리검색하기 90 탭자동완성 91 스크립트파일실행하기 92 3.1.5 IPython pdb 92 사후분석디버깅 92 스크립트를지정하여디버거실행 95 지정한위치에서디버거실행하기 97 3.1.6 97 실행시간측정 97 프로파일링을위한준비 99 실행시간프로파일링 100 메모리사용량에대한프로파일링 103 메모리프로파일링대상을소스코드안에서 104 3.2 Spyder 106 3.2.1 Spyder 106 3.2.2 Spyder 107 프로그램에디터 108 프로그램실행 110 닥스트링이나도움말보기 Object inspector 111 워크스페이스에정의된변수의정보보기 Variable explorer 112 데이터파일입출력 112 3.2.3 UMD Spyder 114 3.3 정리 114 CHAPTER 4 파이썬의기초 115 4.1 작성스타일 117 4.1.1 117 인코딩 117 들여쓰기 118 주석 119 4.1.2 PEP 119 4.1.3 120 4.2 객체와데이터타입 124 4.2.1 4.2.2 column _126 4.2.3 column _128 124 125 127 차례 vii
숫자데이터타입 128 문자열데이터타입 129 리스트 130 튜플 130 바이트및바이트배열 131 딕셔너리 131 집합 132 4.2.4 133 문자열리터럴 133 문자열에서사용되는이스케이프시퀀스 134 숫자리터럴 135 컨테이너타입에대한리터럴 136 4.3 시퀀스타입조작하기 136 4.3.1 4.3.2 4.3.3 4.3.4 4.4 집합타입과딕셔너리타입의조작 142 4.4.1 4.4.2 4.5 변수와데이터 145 137 137 139 140 142 144 4.5.1 145 C 언어의경우 147 4.5.2 148 C 언어의경우 148 4.5.3 149 참조값을할당한후재정의하기 151 2개의변수에동일한리스트를할당하기 152 4.6 얕은복사와깊은복사 154 4.6.1 154 복합객체가아닌경우 154 복합객체인경우 155 4.6.2 157 4.7 연산자와평가식 158 4.7.1 4.7.2 4.7.3 4.7.4 4.8 흐름제어 162 4.8.1 if 4.8.2 for column _165 4.8.3 while 4.8.4 try 4.8.5 with 4.9 함수정의하기 170 4.9.1 158 159 159 161 162 164 166 167 169 170 viii 차례
4.9.2 4.9.3 4.9.4 lambda 4.9.5 4.9.6 4.9.7 4.10 모듈과패키지 179 172 173 174 175 176 178 4.10.1 179 4.10.2 import 181 패키지의 import 183 4.10.3 184 4.11 네임스페이스와유효범위 185 4.11.1 185 4.11.2 186 4.11.3 187 네임스페이스와변수의조작 188 global문과유효범위확장 188 nonlocal과유효범위확장 189 클로저 190 4.12 정리 191 CHAPTER 5 클래스와객체의기초 193 5.1 클래스정의 195 5.1.1 5.1.2 5.1.3 5.1.4 5.2 상속 200 5.2.1 5.3.2 5.3 스태틱메서드와클래스메서드 202 5.3.1 5.3.2 5.4 정보를은폐하는방법 204 5.4.1 5.4.2 5.5 클래스와네임스페이스 206 5.5.1 5.5.2 5.6 정리 210 195 195 198 199 200 201 202 203 204 205 206 207 차례 ix
CHAPTER 6 입력과출력 211 6.1 콘솔입출력 213 6.1.1 6.1.2 6.2 파일입출력의기본 214 6.2.1 open 6.2.2 open 6.2.3 6.2.4 6.3 데이터파일입출력하기 217 213 214 214 215 216 216 6.3.1 217 6.3.2 CSV 218 표준라이브러리모듈 219 NumPy의 CSV 읽기기능을제공하는함수 220 6.3.3 Excel 222 XLS 포맷파일의입출력 222 OOXML 포맷파일의입출력 223 6.3.4 pickle 225 단일변수를 pickle로만들기 225 여러변수를 pickle로만들기 226 6.3.5 228 NumPy의 npy/npz 포맷 228 HDF5 포맷 229 MAT-file 포맷 230 column HDF5_231 6.4 pandas 의데이터입출력기능 232 6.4.1 pandas 232 6.4.2 234 6.4.3 235 데이터읽기자세히보기 240 6.5 웹상의정보를입력받기 242 6.5.1 urllib HTML 242 파이썬 2.x와파이썬 3.x의 urllib과관련된정보 242 column _243 6.6 정리 244 CHAPTER 7 NumPy 245 7.1 NumPy란? 247 7.1.1 NumPy 7.1.2 NumPy 7.1.3 NumPy column _250 247 248 249 x 차례
7.2 NumPy 의데이터타입 251 7.2.1 7.2.2 NumPy 7.2.3 NumPy 7.3 다차원배열객체 ndarray 254 251 252 253 7.3.1 254 7.3.2 ndarray 256 7.3.3 258 7.3.4 ndarray 260 7.3.5 ndarray 263 7.3.6 ndarray 263 7.3.7 ndarray 264 기본인덱싱을통한참조 265 응용인덱싱을통한참조 266 7.3.8 269 7.3.9 271 7.4 유니버설함수 272 7.4.1 ufunc 7.4.2 ufunc 7.5 브로드캐스팅 274 7.5.1 7.5.2 7.5.3 7.6 정리 278 272 273 274 275 276 CHAPTER 8 SciPy 279 8.1 SciPy란? 281 8.1.1 SciPy 8.1.2 NumPy 8.1.3 SciPy 8.1.4 SciPy NumPy 8.2 SciPy 활용하기 285 8.2.1 column _287 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 정리 298 281 282 283 284 285 288 289 291 293 295 차례 xi
CHAPTER 9 matplotlib 299 9.1 matplotlib 이란? 301 9.1.1 matplotlib 9.1.2 matplotlib 9.1.3 matplotlib 9.1.4 pylab pyplot NumPy 9.2 matplotlib 설정하기 304 301 301 302 303 9.2.1 304 설정확인하기, 설정명령으로변경하기 304 9.2.2 306 9.2.3 307 9.2.4 309 9.3 matplotlib 활용하기 312 9.3.1 9.3.2 9.3.3 9.3.4 3 column _322 9.4 그외의그리기툴 323 9.4.1 matplotlib 9.5 정리 324 312 315 319 320 323 CHAPTER 10 pandas 325 10.1 pandas란? 327 10.1.1 pandas 10.1.2 PyData 10.1.3 pandas 10.2 pandas의데이터타입 329 10.2.1 10.2.2 10.2.3 10.2.4 10.3 데이터처리하기 338 10.3.1 pandas API 10.3.2 NumPy 10.3.3 10.3.4 10.3.5 10.3.6 10.3.7 10.3.8 NaN 10.3.9 10.3.10 10.4 정리 362 327 327 328 329 330 332 336 338 340 341 345 348 350 352 355 359 361 xii 차례
C H A P T E R 11 프로그램최적화 365 11.1 프로그램최적화의기본 367 11.1.1 11.2 병목해소 368 367 11.2.1 368 11.2.2 369 선입견을갖지말고시도하기 369 파이썬의내장함수및표준라이브러리를최대한활용 369 반복문사용을최대한피함 370 11.2.3 371 메모리관리 371 ndarray에서메모리절약하기 372 11.2.4 375 IPython을사용하지않고함수프로파일링하기 376 프로파일링결과를시각화하여보기 378 IPython 없이라인프로파일링하기 380 11.3 병렬처리하기 381 11.3.1 CPU column Intel Xeon Phi_382 381 11.3.2 GIL 382 11.3.3 SIMD 383 Intel SIMD 확장명령어세트 383 파이썬에서 SIMD 활용하기 384 column Intel MKL_384 11.3.4 385 멀티스레드프로그램 385 병렬인듯병렬아닌 386 멀티스레드로처리속도를올리려면 387 11.3.5 387 멀티프로세스의장점 388 column GPU_388 11.4 정리 392 ProcessPoolExecutor 389 column Blaze _391 C H A P T E R 12 프로그램최적화 응용예 393 12.1 고속라이브러리활용하기 395 12.1.1 395 12.1.2 Cython 395 Cython의기능 396 12.1.3 Cython 397 Cython 코드작성부터컴파일까지 397 Cython 코드를실행시컴파일하기 399 12.1.4 Cython NumPy Cython 400 차례 xiii
setup 12.1.5 C/C++ C/C++ import 12.2 JIT 컴파일러사용하기 406 12.2.1 Numba column Julia_407 Numba Numba @jitclass Numba ufunc Numba 12.2.2 Numexpr 12.3 정리 417 401 402 403 404 405 406 407 409 410 411 412 413 414 A P P E N D I X 419 A 참고문헌 & 학습자료 421 A.1 421 421 / 421 Jupyter Notebook IPython Notebook 422 Git 422 422 423 A.2 423 423 423 B 내장함수와표준라이브러리 424 B.1 424 B.2 427 C NumPy 함수의레퍼런스 429 C.1 429 C.2 430 445 xiv
옮긴이머리말 파이썬이시쳇말로요즘참핫합니다. 인공지능이나머신러닝연구에서사용되는주요기법이파이썬으로구현되고, 다시이들기법위에새로운아이디어를검증하기위한구현에도파이썬을사용하면서최신기법에대한코드도나날이누적되고있습니다. 보기에따라서는이들연구에는반드시파이썬이사용된다고해도과언이아닙니다. 이렇듯이책은연구및개발활동을위해파이썬으로수치계산프로그래밍을필요로하는엔지니어및연구자를위한책입니다. 이책은크게두부분으로구성됩니다. 전반부는파이썬을처음접하는독자를위해간단한파이썬문법과개발환경을소개하고객체지향설계기법을다룹니다. 그다음이들내용을적용하면서작성한코드에신뢰성을담보하는정적코드분석및단위테스트를수행하는방법을배웁니다. 이어후반부에서는수치계산프로그래밍을위한대표적인라이브러리인 NumPy, SciPy를살펴보고데이터시각화기능을제공하는 matplotlib과계층적데이터구조와이에대한기능을제공하는 pandas를살펴봅니다. 마지막으로이들라이브러리를사용한수치계산프로그램을최적화하기위한다양한기법도다룹니다. 이책의장점은수치계산이라는뚜렷한목적을가진독자의시행착오를최소화한다는점입니다. 파이썬을처음대하는독자를위해파이썬문법및개발환경을소개하고, 이들환경에익숙한독자라도정적코드분석및단위테스트를통해흔히발생하는버그 옮긴이머리말 xv
로인한시행착오를줄이고목표로하는계산내용을구현하는데집중할수있도록도와줍니다. 그리고수치계산에서가장널리쓰이는라이브러리인 SciPy와 NumPy 에대한이해를통해차후이들라이브러리를기반으로하는고수준라이브러리에대한깊은이해를가질수도있습니다. 여기다뒤에나오는최적화기법을더한다면파이썬을이용한수치계산프로그래밍이라는주제를원스톱으로해결하는책이라할수있습니다. 그리까다로운문장은아니었지만그래도이해를돕기위해적극적으로윤문한부분이있습니다. 책의출간을앞둔지금와서생각해보니독자여러분이책을이해하는데혹여저해가되지않을까조금걱정이되기도합니다. 마지막으로, 좋은책을믿고맡겨주신제이펍장성두실장님과이주원편집자님의많은도움에감사합니다. 아내정이에게도고마움을표합니다. 옮긴이심효섭 xvi 옮긴이머리말
머리말 이책은파이썬을처음배우는사람을위한입문서입니다. 그중에서도과학기술컴퓨팅을위해파이썬을사용하려는분들에게필요한기초내용을정리했습니다. 파이썬은여러분야에서제역할을톡톡히해내고있는언어입니다. 각종공학시스템의모형화및시뮬레이션이나기상데이터분석, 인공지능개발, 웹애플리케이션구축을비롯하여자연어처리에이르기까지다양한분야에걸쳐사용되고있습니다. 2016년 3월에구글딥마인드 (DeepMind) 사가개발한인공지능 알파고 (AlphaGo) 가이세돌 9단과의대국에서 4승 1패로승리를거둔것을기억할것입니다. 이알파고에는딥마인드에서개발한 텐서플로 (TensorFlow) 라는파이썬라이브러리가사용되고있습니다. 1 자동차자율주행연구에서좋은성과를냈던프리퍼드네트웍스 (Prefferred Networks) 의 체이너 (Chainer) 도파이썬에서사용되는인공지능개발용라이브러리입니다. 그리고최근에는 IoT(Internet of Things, 사물인터넷 ) 에대한연구가활발히진행되면서빅데이터분석의중요성이대두되고있습니다. 이런분위기에서데이터분석을처음배우는사람들사이에서도이해하기쉬운언어로파이썬의인기가높습니다. 새로운프로그래밍언어일수록과거로부터교훈을받아들여똑똑한기능을갖도록설계 1 URL https://research.googleblog.com/2016/01/alphago-mastering-ancient-game-of-go.html 머리말 xvii
됩니다. 그러나설계가훌륭하다고해서그언어가폭넓게사용되는것은아닙니다. 언어는그역사를더해갈수록언어주변에다양한라이브러리나도구가갖춰지게마련이고, 이를토대로풍부한생태계를형성한다음에널리쓰이게됩니다. 파이썬은이부분에강점을가진언어입니다. 언어자체의스펙은간결하고이해하기쉬우며풍부한생태계를이미갖추고있습니다. 게다가대부분의라이브러리를무료로사용할수있으며, 파이썬자체도개발이중단될염려가거의없습니다. 예를들면파이썬에서 ( 이책에서도설명할 ) Numpy 를사용하면고속수치계산을수행할수있으며, Scipy 에는과학기술컴퓨팅을위한다양한함수가갖춰져있습니다. pandas 를사용하면복잡한구조를갖는데이터를간단히분석할수있습니다. matplotlib 처럼데이터를시각화해주는도구가충실한것도빼놓을수없는부분입니다. 또공학분야에서는분류시뮬레이션프로그램의 빠른프로토타이핑 (rapid prototyping) 이필요할때가많습니다. 동적타이핑을갖춘스크립트언어인파이썬은바로빠른프로토타이핑에적합하다는장점덕분에과학기술컴퓨팅이필요한사람들이많이사용합니다. 이책은과학기술컴퓨팅에서파이썬이지니는매력을많은사람에게알리고자집필했습니다. 파이썬의언어스펙뿐만아니라주요라이브러리의사용법과고속처리를위해필요한기초지식및실무기법을함께소개했기에실용성또한뛰어날것입니다. 또한파이썬을처음배우는분들을위해그림이나표를이용하여쉽게설명하는데도중점을두었습니다. 이책을통해좀더많은독자가파이썬을알게되고독자여러분의기술력향상에조금이라도기여할수있다면더할나위없이기쁠것입니다. 감사의말씀이책의집필과정에서도쿄대학교의타우라켄지로선생님, 추부대학의에비누마타쿠지선생님에게많은조언을받았습니다. 진심으로감사드립니다. 파이썬이라는멋진언어를태어나게한귀도반로섬과관련커뮤니티, 그리고여러라이 xviii 머리말
브러리가갖춰지는데많은개발자여러분의열의와헌신이있었습니다. 이들에게도진심으로경의와감사의마음을표합니다. 주말이나휴일에도집필에만몰두하던저를응원해준아내야스코와이책을쓰는중에태어난딸사오리에게도감사를전합니다. 지은이나카쿠키켄지 머리말 xix
이책의구성 이책에서는파이썬언어스펙과기본적인내용에더해연구개발분야에서파이썬이어떻게쓰이는가에중점을두고파이썬을소개합니다. 주로이공계학생이나엔지니어들이파이썬의생태계를활용하여효율적인연구, 개발을하는데도움이되는구성을택하고있습니다. 각장은아래와같은내용으로구성됩니다. 1장 과학기술컴퓨팅과파이썬 에서는파이썬이라는언어의특징과프로그래밍언어에서갖는위상, 그리고현재파이썬이어떻게쓰이고있는가에대한동향등을소개합니다. 이를통해왜지금파이썬을사용해야하는지에대한이유를이해하게됩니다. 2장 제로부터시작하는시뮬레이터개발 에서는무 ( 無 ) 에서부터시작하여시뮬레이션프로그램을개발하고이프로그램을개선해가는과정을살펴보게됩니다. 이과정을통해효율적인프로그램을개발하는데필요한전체적인절차를배우게됩니다. 3장 IPython과 Spyder 에서는파이썬의표준대화형셸이라할수있는 IPython과통합개발환경인 Spyder를다룹니다. 이도구의기능과사용법을익히면서여러분의생산성도비약적으로향상될것입니다. 4장 파이썬의기초 에서는파이썬을처음배우는독자를위해파이썬언어의기본적인문법을설명합니다. 그리고 5장 클래스와객체의기초 에서파이썬의객체지향관련기능을설명한뒤, 6장 입력과출력 에서는데이터의입출력방법에대한큰그림을제공합니다. 이렇게 3개장을배우고나면파이썬으로프로그래밍을시작할수있습니다. xx 이책의구성
7장부터 10장까지는과학기술컴퓨팅에필수라이브러리인 Numpy, SciPy, matplotlib, pandas 를각각다룹니다. 이들라이브러리는과학기술컴퓨팅에가장중요한것으로이러한라이브러리를능숙하게사용하면구현할수있는작업이대폭늘어납니다. 11장 프로그램최적화 및 12장 프로그램최적화 응용예 에서는빠른프로그램을작성하는데필요한원칙과도구를사용하는구체적인예에대해소개합니다. 이장의내용은과학기술컴퓨팅에서파이썬을이용하는고급프로그래머가될수있도록해줍니다. 이책의대상독자이책의대상독자는앞으로과학기술컴퓨팅혹은엔지니어링에파이썬을처음사용하려는분들입니다. 아래와같은독자에게추천합니다. 파이썬이어떤언어인지, 어떤일을할수있는지배우고싶은분 파이썬으로과학기술컴퓨팅을수행하려는분 파이썬고성능프로그래밍의기초를배우고싶은분 파이썬으로실제프로그래밍작성법을배우고싶은분이책은파이썬의기본적인문법뿐만아니라과학기술컴퓨팅을효율적으로수행하기위한기술을익힐수있도록구성됐습니다. 단순히언어스펙만이아닌효율적인프로그래밍을익히려는분에게가장적합합니다. 동작확인에쓰인운영체제와파이썬버전이책의프로그램은윈도우 8 이상에서검증되었으며, 벤치마크테스트할때의동작환경은 1장의 성능비교의세부사항 절에서볼수있습니다. 이책의내용은기본적으로윈도우, 맥OS, 리눅스어떤운영체제에서도동일한동작을확인할수있습니다. 설정과관련된내용이나파일경로를나타내는방법등운영체제에따라달라지는부분도있지만프로그램을작성하는방법은차이가거의없습니다. 달라질수있는부분에대해서는그때마다설명을덧붙였습니다. 이책의구성 xxi
파이썬버전은 3.5 이상을전제로합니다. 앞으로파이썬을활용하려는독자에게는 2.x 대버전은그다지배울필요가없을것입니다. 새로운언어스펙은 3.x 대위주로추가됐으므로파이썬역시최신버전을사용하기바랍니다. 다만, 다양한패키지의의존관계문제를직접해결하려면시간과노력이많이소요되므로최신버전에대한배포패키지를이용하는방법을추천합니다. 그리고파이썬에는몇가지서로다른구현이있지만이책에서는기준구현이되는 CPython(C 언어로구현된파이썬 ) 을사용합니다. 독자여러분도일부러다른구현을선택하지않는이상은 CPython을사용하게될것입니다. 이책의지원페이지 이책의지원페이지는다음 URL 로접속하면됩니다. URL https://github.com/jpub/sctechpython 이책과관련한정보및동작확인에필요한개발환경을갖추기위한정보로아래와같 은내용이포함돼있습니다. 배포패키지설치 C/C++ 컴파일러설정 ( 특히윈도우환경에서 ) 주요서드파티라이브러리 (NumPy, SciPy, matplotlib, pandas, IPython 등 ) 의설치및설정이책에나온예제코드도해당페이지를참조하십시오. xxii 이책의구성
베타리더후기 김종욱 ( 카이스트 ) 이책은파이썬을이용하여효과적인과학기술연산을가능하게합니다. 파이썬이스크 립트언어이기때문에 C나 C++ 보다느릴것이라생각했는데, 파이썬전용가속라이브러리가있어이러한한계를극복할수있다는것을이책을통해처음으로알게되었습니다. 이책에서는파이썬에서제공하는다양한기능들, 특히연산처리를최적화하는방법에관해잘정리했습니다. 다른책에서는단순한앱을만들면서파이썬을학습하는데초점을둔반면, 이책의경우성능향상이라는부분에초점을두고서술했다는점에서기존의책과다른접근에참신한인상을받았습니다. 다만, 이책의경우어느정도컴퓨터구조에대한지식을요하는만큼초급자분들이읽기에는어려울수있습니다. 고승광 ( 플랜티넷 ) 요즘핫한언어이자당분간계속핫할파이썬에대한중급수준의책입니다. 파이썬문법만겨우알고있고아직제대로된개발을해보지못한저와같은초급자에게는다소어려운내용이많습니다. 그렇지만다른파이썬기본서에는없었던내용을꽤많이소개해서보다심화된내용을필요로하는개발에도움이될듯합니다. 베타리더후기 xxiii
박두현 ( 마블러스 ) 이책은파이썬을처음배우고자하는사람에게어울리는책은아닙니다. 하지만데이터과학의맛을보고자하는분에게이만한책이없다고생각합니다. 일반애플리케이션제작과데이터분석의코딩이무엇이다른지, 접근하는방식이어떻게다른지에대해알수있어서유익했습니다. 베타리딩하는동안가장재미있게읽은책입니다. 데이터분석이일반프로그래밍과무엇이다른지깨닫게해주었습니다. 박조은파이썬생태계는방대해서이해하고사용할수있는것은일부에지나지않습니다. 이책을통해과학기술계산과관련하여어렵게느껴졌던여러패키지들을다양한예제와함께실행해볼수있었습니다. 여전히파이썬의여러기능을적재적소에제대로사용하는건어렵지만, 이중에서어떤것을선택해서더깊게공부해야할지방향을잡는데도움이되었습니다. 최근데이터과학을공부하면서과학기술컴퓨팅을위한라이브러리와패키지를사용하고있지만, 패키지의모든내용을알기도어려울뿐더러알고있는내용을제대로써먹는일도어렵습니다. 이책을통해그동안조금씩익혔던파이썬의여러라이브러리의기능을정리하고모르고있었던새로운기술을익힐수있는기회가됐습니다. 이철혁 ( 스노우 ) 파이썬을처음접하는분들에게기초부터필수확장라이브러리인 NumPy, SciPy, pandas 에대해개념을잡을수있는책입니다. 고급활용까지는아니지만기본기를다지고공식문서를볼수있는실력을배양할수있습니다. 책에서대표적 IDE 설명으로 Spyder를소개하는데, 국내에서는 PyCharm을좀더많이사용하니비교해서맞는 IDE 를사용하면좋겠습니다. 개인적으로 Numpy, SciPy, pandas 등라이브러리설명에좀더집중했으면좋았을것같습니다. 그래도파이썬기초에대해충실하게다루고있습니다. 파이썬입문과심화과정을한권에잘담았습니다. xxiv 베타리더후기
최승호 ( 네이버 ) 파이썬이라는녀석으로데이터분석, 과학수식연산, 시각화도표까지라이브러리로해결할수있기때문에일석이조를넘어일석삼조도가능하다고생각합니다. 파이썬을해야해? 가아닌 파이썬은해야해! 가맞다고생각합니다. 특히, 이책은설명이자세해서파이썬입문자에게도강력히추천합니다. 제이펍은책에대한애정과기술에대한열정이뜨거운베타리더들로하여금출간되는모든서적에사전검증을시행하고있습니다. 베타리더후기 xxv
1C H A P T E R 과학기술컴퓨팅과파이썬
과학기술컴퓨팅분야에서는지금까지 C/C++, Fortran, Java, MATLAB 등이널리쓰였다. 그러나이제파이썬이이들을대체하여널리사용되고있다. 이번장에서는과학기술컴퓨팅분야에서파이썬이대두하게된현실을데이터에근거하여알아본다. 그리고파이썬개발에대한역사및언어적특징에대해서도소개한다. 특히초심자가망설이기쉬운파이썬의버전선택에대해서도다룬다. 마지막으로과학기술컴퓨팅분야에서파이썬이점점널리사용되는이유를 C 언어와의벤치마크테스트등다양한각도에서조명해본다.
1.1 데이터로살펴보는파이썬의현재 파이썬은다양한분야에서매우인기가높은언어다. 그렇다면실제로는누가, 어떤용도로사용하고있는것일까? 또한얼마나널리쓰이고있는것일까? 이번절에서는파이썬의현재인기도에대한검증및과학기술컴퓨팅에서점점널리사용되고있는실상을알아볼것이다. 마지막으로일본에서사용되는현황및앞으로의전망에대해서도살펴본다. 1.1.1 파이썬의대두파이썬 (Python) 을쓰는사용자는얼마나될까? 먼저파이썬의인기도가어느정도인지부터살펴보자. 프로그래밍언어의인기도를알수있는지표중하나로 TIOBE index 1 가있다. 이지수는 TIOBE 는기업이작성하고있는지표로대부분의주요검색서비스 (2016 년 8월기준 Google, Bing, Yahoo!, Wikipedia, Amazon, YouTube, Baidu 등 25개서비스포함 ) 등에서아래와같은쿼리로얻은결과를분석하여계산한값 (Ratings 2 ) 을통해얻은결과를표 1.1 에실었다. +"<language> programming" 이결과를보면 Java와 C 언어가절대적인인기를누리고있음을알수있다. 파이썬은 5 위에랭크되었으나매해상승폭이가장컸던언어에주는 Programming Language of the Year 에 2007년부터 2010년까지뽑힌바있다. 그러나파이썬이과학기술컴퓨팅에서얼마나쓰이고있는지는 TIOBE index만으로는알기어렵다. 이를확인하기위해 IEEE(Institute of Electrical and ElectronicsEngineers) 에서추산하는프로그래밍언어에대한인기도지표를살펴보자. 잡지 <IEEE Spectrum> (IEEE) 에서정리한 Top Programming Languages 라는프로그래밍언어지표를표 1.2 에실었다. 이지표는 Google Search, Google Trend, Twitter, GitHub, Stack Overflow, 1 TIOBE 는 티오비 또는 타이오비 라고읽는다. 2 지표의값. 이값의정의에대해서는다음 URL 참조. TIOBE Programming Community Index Definition URL http://www.tiobe.com/tiobe_index?page=programminglanguages_definition 1.1 데이터로살펴보는파이썬의현재 3
Reddit, IEEE Xplore Digital Library(IEEE Xplore) 등 10개정보서비스로부터얻은언어의이용도지표에 IEEE가독자적으로산정한점수를곱하여계산한것이다. 표 1.2 에나온전체지표가이순위에해당한다. 이결과에서는파이썬이 3위에랭크되어있다. 그러나이결과역시앞에서본 TIOBE index 와마찬가지로과학기술컴퓨팅에대한프로그래밍언어의인기도를나타내는지표로보기는어렵다. 이 Top Programming Languages에서는순위산출시사용되는가중치를바꿀수있으므로 IEEE Xplore만으로순위를매겨보자. IEEE Xplore에는과학기술분야 360만편이상의논문이나기사가등록되어있다. 이들논문중에서언어가언급된횟수를인기도의지표로삼으면과학기술컴퓨팅분야에서어떤언어가많이쓰이는지를알수있다. 3 특히 2016년에발표된논문만을대상으로계산한인기도지표를표 1.2 의 IEEE Xplore만 열에서볼수있다. 1위부터 3위까지는전체지표순위와변화가없어파이썬이 3위에자리잡고있다. 4위이하부터는실행속도면에서유리한 C++, 스크립트언어인 MATLAB, 데이터통계처리에강점이있는 R, 강력한데이터시각화기능을가진 Processing 등의언어가상위에있다. 이데이터로파이썬이과학기술컴퓨팅분야에서도최상위에해당하는인기도를누리고있음을알수있다. 이외에도파이썬이과학기술컴퓨팅분야에서인기가오르면서파이썬사용이늘어나고있음을보여주는데이터가있다. 과학기술컴퓨팅을위해파이썬을사용할때필수라할수있을만큼많이사용되는패키지로 NumPy( 넘파이 ), SciPy( 사이파이 ) 가있다. 이들패키지를다운로드한횟수를그림 1.1 에나타냈다. 이그래프는 PyPI( 파이피아이, 뒤에설명함 ) 라고하는파이썬공식저장소의통계치다. 4 리눅스 5 나맥OS 같은운영체제에는이들패키지가기본적으로탑재되며, 윈도용파이썬배포판에도포함되어있으므로이값은경향에대해참고만하기바란다. 주목해야할것은다운로드횟수의변화다. 2012 년이후로다운로드수가대폭증가했음을알수있다. 3 웹애플리케이션및모바일, 임베디드분야에쓰인프로그램은추가로제외한다. 4 최근의데이터는입수가불가능하여 (2016 년 8 월시점 ) 2014 년까지의데이터를사용했다. 5 Ubuntu, Debian GNU/Linux, Red Hat Enterprise Linux, CentOS 등대부분의리눅스배포판에서파이썬을사용할수있다. 4 CHAPTER 1 과학기술컴퓨팅과파이썬
이것은 NumPy 를의존패키지로하는패키지가늘어난것도원인이지만, 파이썬을과학 기술컴퓨팅에사용하는사람이크게늘어난것으로봐도무방할것이다. 1 1 TIOBE Index 2016 8 순위 언어 Ratings(%) 순위 언어 Ratings(%) 1 Java 19.01 11 Delphi/Object Pascal 2.28 2 C 11.30 12 Ruby 2.28 3 C++ 5.80 13 Visual Basic 2.05 4 C# 4.91 14 Swift 1.98 5 Python 4.40 15 Objective-C 1.88 6 PHP 3.17 16 Groovy 1.64 7 Javascript 2.71 17 R 1.61 8 Visual Basic.NET 2.52 18 MATLAB 1.54 9 Perl 2.51 19 PL/SQL 1.38 10 Assembly 2.36 20 Go 1.27 1 2 IEEE Spectrum 2016 순위 전체지표 IEEE Xplore만 순위 전체지표 IEEE Xplore만 1 C C 6 C# R 2 Java Java 7 PHP CUDA 3 Python Python 8 Javascript C++ 4 C++ MATLAB 9 Ruby Processing 5 R C# 10 Go LabView 다운로드수 ( 만번 ) 연도 1 1 NumPy/SciPy 1.1 데이터로살펴보는파이썬의현재 5
1.1.2 교육용언어로서의파이썬앞절을읽은독자들중에는 파이썬이제일인기좋은언어는아니구만 이라고생각하는독자도있을수있다. 그러나파이썬에는중요한특징이하나더있다. 바로프로그래밍을처음배우는사람이아주쉽게배울수있는언어라는점이다. 앞에서도설명했지만파이썬은언어스펙에대한정의를필요최소한으로줄인비교적간단한언어이며가독성도뛰어나다 ( 뒤에설명함 ). 이때문에파이썬은프로그래밍이나컴퓨터과학을처음배우는사람에게도안성맞춤인언어다. 미국의 39개최상위대학의컴퓨터과학과정에서파이썬을교육용으로가장많이사용한다는데이터가있다. 그림 1.2 는필립구오 (Philip Guo) 6 가조사한상위 10위컴퓨터과학과중 8곳에서컴퓨터과학입문강의에파이썬을사용하고있으며, 이를 39개대학전체로범위를넓히면 27곳의학과에서파이썬을사용하고있다. 일반적으로인기가높은 Java나 C보다파이썬이교육현장에서보다널리쓰이고있다는것은초심자에게도쉬운언어이기때문이다. 강의에서채택된수 언어 1 2 39 6 URL http://www.pgbovine.net 6 CHAPTER 1 과학기술컴퓨팅과파이썬
1.1.3 일본에서의사용현황해외여러나라에서는웹개발이나과학기술컴퓨팅을막론하고파이썬이매우널리사용되고있지만일본은이트렌드에한발짝뒤처져있는느낌이다. 유럽이나미국의트렌드에뒤처져있는이유는무엇일까? 여러가지원인이있겠지만그중주된원인은다음과같은것을꼽을수있다. ❶ MATLAB 등기존언어로부터파이썬으로옮길이유가딱히없다. ❷ 일본어로된서적및웹에서의정보가충실하지못하다. ❸ Ruby를사용한다. ❹ 실행속도가느리다. ❶은 MATLAB 등다른언어의존재때문이다. MATLAB은이공계분야에서절대적인인기를자랑한다. MATLAB은이공계의다양한연구와설계작업에쓰이며많은분야에서사실상표준 (De Facto Standard) 의입지를확실히다져왔다. 그러나 MATLAB은유료이며여기에여러개의툴박스까지함께갖추려면고액의라이선스비용이필요하다. 이에비해파이썬은 MATLAB에뒤지지않을만큼다양한패키지를갖추고있으면서도대부분무료로사용할수있다. ❷는일본어로된문서가부족한것이원인이다. CPython( 파이썬의 C 언어구현, 뒤에설명함 ) 이나여러라이브러리는오픈소스 7 프로젝트로개발되지만이중일본어를구사할수있는개발자는비교적적다. 이때문에일본어문서는영어문서에비해서작성되는속도가늦다. ❸은 Ruby의존재때문이다. Ruby는마츠모토유키히로가개발한일본에서만들어진스크립트언어로파이썬과입지가비슷한면이있다. 일본어정보도비교적충실하므로분야에따라조금다르지만파이썬대신 Ruby를채택하는경우도적지않다. 마지막으로 ❹는파이썬의느린속도가문제가된다. 그러나이게사실일까? 일반적인경우파이썬이 C보다실행속도가느린것은사실이다. 하지만이는파이썬본체의기능만 7 소스코드가공개되어있으며, 자유롭게재배포가가능하고, 특정한제품에의존하지않는등의조건을만족하면오픈소스라불린다. 1.1 데이터로살펴보는파이썬의현재 7
을사용한경우의이야기다. 이책에서도소개할 NumPy 나 Numba 등서드파티라이브 러리의기능을사용하면경우에따라서는 C 와동등하거나혹은그이상의실행속도도 가능하다. 이부분에대해서는 1.3 절에서자세히설명하겠다. 1.2 파이썬기초지식 이번절에서는파이썬이어떤언어인지알기위해파이썬의역사와특징을소개하겠다. 가독성과유지보수의우수성, 강력한표준라이브러리를갖춘파이썬의특징과함께파이썬의풍부한생태계등에대해소개한다. 그리고파이썬을처음배울때망설이기쉬운버전 (ver. 2, 3) 의선택에대해서도다룬다. 1.2.1 파이썬의개발배경파이썬은다양한분야에서사용되는범용프로그래밍언어다. 또한동적프로그래밍언 어 (dynamic programming language) 의한종류로사전에컴파일하는대신실행할때이를기계어로변환하는인터프리터를갖는언어다. 파이썬은귀도반로섬 (Guido van Rossum) 이 CWI(Centrum Wiskunde & Information) 에재직하던 1989 년개발을시작하여 1991년에초기버전이공개되었다. 현재파이썬의구현은표 1.3 에서보듯여러가지가존재한다. 이들모두무료로 ( 영리목적을포함하여 ) 사용할수있다. 레퍼런스구현 (reference implementation) 이되는 CPython 은버전업또한빈번하며비영리단체인 PSF(Python Software Foundation) 의관리아래배포되고있다. 8 윈도우, 리눅스, 맥OS 외에도많은운영체제에서동작하며 32비트 (x86) 뿐만아니라 64비트 (x64/x86-64) CPU에도대응하고있다. 64비트운영체제 /CPU로메모리 (memory, 주기억장치 ) 를대량으로사용하는과학기술컴퓨팅 (1.3 절참조 ) 을수행하려는경우에도적합하다. 8 버그수정을포함하여향후지속적인개발이실질적으로보장된것은 CPython 뿐이다. 그런의미에서 CPython 이가장안심하고사용할수있는구현이라고할수있다. 8 CHAPTER 1 과학기술컴퓨팅과파이썬
이런이유로파이썬의배포패키지 9 에가장많이쓰이는것도 CPython이다. 하지만 CPython 외의구현도각각뛰어난점이있으므로 Java나.NET 프레임워크와연동되는프로그램을작성하는경우등에는 CPython 이외의구현을사용하는것도검토해볼만하다. 1 3 구현명 CPython PyPy Jython IronPython 설명 C 로구현된파이썬의레퍼런스구현. 일반적으로가장널리사용된다. PSF License( 라이선스의내용은뒤에설명함 ) RPython(Restricted Python) 이라고도불리는파이썬의서브셋언어를구현한파이썬의인터프리터. JIT(Just-in-Time) 컴파일러를사용하여 CPython 보다속도가빠르다. MIT License Java 를사용한파이썬구현. Java 의다양한클래스를언어적경계없이 (seamless) 사용할수있다. PSF License(version 2).NET 프레임워크의 API 를직접호출할수있는파이썬구현. 2016 년 8 월기준파이썬 2.7 을구현하고있다. Apache License 2.0 1.2.2 파이썬의특징이번절에서는아래의키워드로파이썬의특징을설명한다. ❶ 가독성과유지보수성 ❷ 인터프리터언어 ❸ 스크립트언어 ❹ 접착제언어 ❺ 배터리내장 ❻ 풍부한생태계 9 파이썬본체와서드파티라이브러리를모아다양한용도로즉시사용가능한패키지를구성한것. Anaconda 와 WinPython 등이있다 ( 뒤에설명함 ). 1.2 파이썬기초지식 9
❶ 가독성과유지보수성파이썬의문법은비교적간단하며 10 들여쓰기 (indent) 로코드블록의범위를결정하는구조또한뛰어난가독성을가능케한다. 이때문에파이썬은배우기쉽고, 코드를읽기쉬우며, 결과적으로뛰어난유지보수성이확보된다. 그리고파이썬에서는 코드를작성하는것보다읽는경우가많다 라는명제아래작성스타일에일관성을유지하여가독성을향상시키는것이중시된다. 이때문에 PEP 8(4.1 절참조 ) 이라는가이드라인이나와있으며기본적으로이가이드라인을따르도록추천하고있다. 11 그러나프로젝트에따라서는 PEP 8과다른코딩규약을두는경우도있다. ❷ 인터프리터언어파이썬은인터프리터언어다. 프로그램을순차적으로해석하여실행하는구조이며소스코드를컴파일할필요가없다. 인터프리터언어는실행할코드를입력하면서프로그램을순차적으로실행할수있다. ❸ 스크립트언어스크립트언어의정의는꽤애매하지만일반적으로동적타이핑언어일것, 인터프리터언어일것, 저수준기술이필요하지않으며소규모프로그램에적합할것정도의조건을갖춘언어를말한다. 다만, 파이썬은대규모프로그램도작성할수있다. Google이나 Dropbox 에서대규모시스템을구축하는데파이썬을사용한것 12 을보면이를알수있다. 또한스크립트언어는처리내용을간결하게작성할수있다는특징을갖는다. 이를보여주는단적인예를들자면 Java와 C로 Hello World 를출력하는프로그램을작성하면각각리스트 1.1, 리스트 1.2 와같은코드가된다. 그러나파이썬 3.x( 파이썬 2.x 와의차이점은뒤에설명함, 뒤에나올표 1.4 도함께참조 ) 에서는리스트 1.3 에서보듯딱한줄로가능하다. 10 간단한문법을갖게된것에는동적타이핑언어라는특징도무관하지않다. 11 이책에포함된샘플코드혹은실행예제도 PEP 8 을기본적으로준수하고있다. 완전히통일된것처럼보이지않는경우도있음을참고하자. 다음은모두옳은예이다. i = i + 1, submitted += 1, x = x * 2-1, hypot2 = x * x + y * y, c = (a + b) * (a - b) 12 Google 의사용예는 ❶ 을, Dropbox 의사용예는 ❷ 를참조하기바란다. ❶ http://quintagroup.com/cms/python/google ❷ https://www.youtube.com/ watch?v=as3ishcknz0 10 CHAPTER 1 과학기술컴퓨팅과파이썬
파이썬에서는같은처리를구현하기위한코드량이다른언어보다줄어드는경향이있으 며, 이것은기억해야할문법이적다는의미이기도하다. 이때문에초심자가다루기쉬 우며프로그래밍교육용으로도폭넓게쓰일수있다. 1 1 Java Hello World public class HelloWorld { public static void main(string[] args) { System.out.println("Hello World"); } } 1 2 C Hello World #include <stdio.h> int main() { printf("hello World"); return 0; } 1 3 Hello World print("hello World") ❹ 접착제언어파이썬을흔히접착제언어 (glue language) 라고도부른다. 접착제언어란다른언어로작성된프로그램을쉽게통합할수있는언어를말한다. C나 C++, Fortran으로작성된기존프로그램을쉽게파이썬프로그램안에통합시킬수있는것이다 (12.1 절참조 ). 이는파이썬이과학기술컴퓨팅분야에서성공할수있었던큰요인중하나이기도하다. ❺ 배터리내장파이썬은다양한처리를수행할수있는강력한표준라이브러리를갖추고있는데이를 battery included 라표현하기도한다. 파이썬을설치하면곧바로표준라이브러리로프로그램을작성할수있다. 부록 B에서이표준라이브러리에대해간단히설명하고있으므로이를참조하기바란다. 1.2 파이썬기초지식 11
❻ 풍부한생태계표준라이브러리외에도막대한수의서드파티라이브러리가만들어져있다. 이중과학기술컴퓨팅분야에서사용되는패키지로는 NumPy, SciPy, matplotlib, pandas 등이유명하다. 파이썬은이들패키지덕분에엔지니어링분야등에서절대적인인기를누리는 MATLAB과어깨를나란히하고있다. 이들서드파티라이브러리나개발환경등을포함한파이썬프로그램의개발환경전반을가리켜 생태계 (ecosystem) 라고부른다. 파이썬의생태계는현재거의대부분이무료소프트웨어임에도불구하고성능이상당히뛰어나다. 그림 1.3 13 에과학기술컴퓨팅을중심으로본파이썬생태계를도식화한그림을실었다. 이그림에서볼수있듯이파이썬본체다음으로기반이되는서드파티라이브러리는 NumPy 이다. 이패키지덕분에행렬계산이나합곱연산등다양한수치계산을빠르게수행할수있다. Python 고속연산프레임워크 / 다른언어와의연동 (Cython, Numba, Numexpr 등 ) NumPy 다차원배열 / 선형대수 / 행렬계산등 SciPy, pandas, scikit-learn, scikit-image, SymPy, Blaze, Statsmodels, Pillow 등통계 / 신호처리 / 이미지처리 / 데이터분석 / 머신러닝 / 수식처리 / 그외확장기능 matplotlib, MayaVi, Bokeh, VisPy 등그래프작성 / 데이터시각화 IPython 고성능대화형셸 (QtConsole, Notebook) Spyder, PyCharm, PTVS, Canopy 등통합개발환경 대표적인무료배포패키지 Anaconda Enthought Canopy 1 3 WinPython Python(x,y) 그리고 NumPy 를이용하는많은과학기술컴퓨팅용패키지가파이썬생태계의핵심 을이룬다. 그중에서도 SciPy 는거의필수라고할정도로고속푸리에변환 (Fast Fourier Transform, FFT) 이나최적화, 수치적분, 신호처리등다양한과학기술컴퓨팅과관련 13 다음페이지를참조하여저자가작성함. URL http://indranilsinharoy.com/2013/01/06/ 12 CHAPTER 1 과학기술컴퓨팅과파이썬
된기능을제공하는패키지다. 그외에도이미지처리를위한 Pillow나 scikit-image, 머신러닝을위한 scikit-learn, 수식처리기능을제공하는 SymPy, 통계처리기능을제공하는 Statsmodels 등의패키지가있다. 그래프나데이터시각화도구도 (matplotlib, MayaVi, Bokeh, VisPy 등 ) 충실히갖춰져있다. 게다가지금까지열거했던다양한도구를대화형환경에서사용할수있게해주는중요한도구가 IPython이다. 운영체제나파일시스템과도연계할수있는고성능대화형셸기능을제공하는 IPython 셸외에도병렬계산엔진기능, Jupyter Notebook(IPython Notebook) 이라는웹기반의실행가능한문서포맷을제공한다. 그리고가장중요한것은이들도구를사용하게될환경을간단히구축할수있다는점이다. 그림 1.3 에서도배포패키지로나타낸부분을보면 Anaconda와 WinPython 등간단히설치하여바로사용할수있도록되어있다. 특히 Anaconda는윈도우, 리눅스, 맥 OS 어느환경에서도사용할수있으며 conda라는패키지관리명령어를통해의존성을편리하게관리할수있다. 이렇듯파이썬의생태계는매우충실하게갖추어져있으며이중대부분은무료로배포된다. column 귀도반로섬은 CWI에재직중에 CWI에서개발하던 ABC 라는명령형범용프로그래밍언어를사용하고있었다. 그러나 ABC의언어스펙에불만스러웠던점을해결한언어를직접개발하기로마음먹고크리스마스휴가동안개발을시작한다. 이것이파이썬의시작이었다. 귀도반로섬은이파이썬의초기버전을분산운영체제 Amoeba의시스템관리에응용하여성공을거둔다. 그후파이썬은 USENET( 네트워크상에있는여러서버를사용해서주로텍스트데이터를배포하던시스템 ) 에소개되어많은지지자를얻고커뮤니티를형성하면서개발이진행되게되었다. 파이썬이라는이름은 Monty Python s Flying Circus ( 몬티파이썬의하늘을나는서커스 ) 라는 TV 프로그램에서딴것이다. Monty Python은영국의코미디그룹으로이이름을딴프로그램이영국의 BBC에서 1970년대방송되고있었다. 귀도반로섬은짧고독특하면서도신비감을주는이름을고민하다가마침이방송의대본집에서파이썬이라는이름을골랐다. 덕분에파이썬을다룬서적에는비단뱀 ( 파이썬 ) 그림을표지로하는경우가많다. 1.2 파이썬기초지식 13
1.2.3 패키지관리시스템파이썬의패키지대부분은 PyPI(Python Package Index) 14 라는패키지저장소에서관리되고있다. 주요패키지는거의다 PyPI 에등록되어있다고보면된다. 그림 1.4 에 PyPI 를검색한웹페이지스냅샷을실었다. PyPI 에서오른쪽상단에위치한검책창에패키지명을입력하면패키지를검색할수있다. 검색결과를통해개발중인사이트의웹주소나설치를위한패키지를찾을수있다. 1 4 PyPI astropy PyPI 에등록된패키지는 pip 라는명령으로설치할수있다. pip 를사용하면 PyPI 에서패 키지를자동으로내려받은뒤의존패키지와함께설치한다. 1.2.4 파이썬 2.x 대와파이썬 3.x 대 파이썬에대한큰문제중하나가버전 2.x 대와 3.x 대의서로다른구현이있다는점이다. 파이썬 3.x 대는 2008 년처음으로공개되었다. 이때언어의스펙에큰변화가있었다. 이 14 URL https://pypi.python.org/pypi 14 CHAPTER 1 과학기술컴퓨팅과파이썬
때문에파이썬 3.x 대는파이썬 2.x 대에대한상호호환성을잃을만큼많은기능추가와 스펙변경이발생했다. 15 즉, 파이썬 2.x 대로작성된프로그램은파이썬 3.x 대에서수정 없이는동작하지않게되었다. 이런결단에는논란이많았지만파이썬개발자인귀도반 로섬은파이썬 2.x 대의단점을수정하고언어스펙의일관성을높이며초심자가좀더이 해하기쉬운언어를만들기위해결단을내렸다. 16 표 1.4 에파이썬 2.x 대와 3.x 대의주요차이점의예를들었다. 여기에실은차이점은극히 일부에지나지않지만문법이세부사항까지변경되어있음을알수있다. 단, 과학기술 컴퓨팅에사용되는 NumPy 나 SciPy 의프로그램작성법은파이썬 2.x 대와 3.x 대에서거 의차이가없다. 이책에서는파이썬을과학기술컴퓨팅에사용하려는입장에서파이썬 2.x 대와 3.x 대 중어느쪽을선택해야하냐는질문에지금까지설명했던이유외에도다음과같은이유 로 3.x 대의사용을추천한다. 파이썬 3.x 대를지원하지않는라이브러리도있지만과학기술컴퓨팅에사용되는 주요패키지 (NumPy, SciPy, matplotlib, pandas 등 ) 는파이썬 3.x 대를지원한다 앞으로있을표준라이브러리의개선, 언어의스펙추가는기본적으로파이썬 3.x 대에만적용될것이다 파이썬 2.x 대 ( 버전 2.7.x) 의지원은 2020 년으로종료된다 운영체제에파이썬 2.7 이선탑재되어있다는이유로파이썬 2.x 대를사용하는독자들도 있겠지만, 특별한사정이있는경우가아니라면굳이파이썬 2.x 대를선택해야할이유는 없다. 또, 특정패키지의파이썬 3.x 대지원여부는 Can I Use Python3? 17 문서나 PyPI 에서확인할수있다. 15 자세한내용은귀도반로섬이파이썬 3.x 대의새로운기능에대해밝힌다음문서를참조하기바란다. URL http://docs.python.org/3/whatsnew/3.0.html 16 귀도반로섬은자신을 BDFL(Benevolent Dictator For Life, 자비로운종신독재관 ) 이라칭하며파이썬의개발을현재도주도하고있다. 17 URL https://caniusepython3.com/ 1.2 파이썬기초지식 15
1 4 2 x 3 x 파이썬 2.x대 파이썬 3.x대 print x, y print(x, y) x = 7 / 2 # x==3 x = 7 // 2 # x==3 x = 7 / 2.0 # x==3.5 x = 7 / 2 # x==3.5 str=u' 문자 ' str=' 문자 ' if x <> y: if x!= y: str = raw_input(msg) str = input(msg) x = input(msg) x = eval(input(msg)) for line in.le.xreadlines(): for line in.le: apply(func, args, kwargs) func(*args, **kwargs) if m.has_key(n): if n in m: x = itertools.imap(func, seq) x = map(func, seq) x = itertools.izip(seq1, seq2) x = zip(seq1, seq2) fn.func_doc fn. doc raise "SomeError" raise Exception("SomeError") L = [x for x in 3,6] L = [x for x in (3,6)] column 파이썬은현재비영리단체인 PSF의관리아래레퍼런스구현인 CPython이 PSFL(Python Software Foundation License) 로공개되어있다. CPython과이책에서소개하는주요서드파티라이브러리의라이선스를표 C1.1에실었다. 각각의라이선스에대한자세한내용은여기서설명하지않지만중요한점은모두무료로사용할수있고, 카피레프트라이선스 (Copyleft License, 저작물의사용, 수정, 재배포등을제한하지않는것은물론이를이용한 2차저작물역시도사용, 수정, 재배포를제한하지못하도록하는라이선스 ) 는아니라는것이다. 따라서프로그램을수정하여독자적인소프트웨어를만들어도이소프트웨어의소스코드를공개할의무가없다. 이런높은자유도역시파이썬이널리보급되는한가지요인이되었다. C1 1 파이썬본체 PSFL NumPy, SciPy, pandas, IPython BSD License matplotlib matplotlib license(bsd 스타일 /PSFL 기반 ) Spyder MIT License 16 CHAPTER 1 과학기술컴퓨팅과파이썬
1.3 과학기술컴퓨팅과파이썬의관계 파이썬은과학기술컴퓨팅분야에서어떻게쓰이고있을까? 그리고파이썬이느리다는것은정말일까? 다른언어와비교해보면서과학기술컴퓨팅분야에서의파이썬의입지와전망을살펴보자. 1.3.1 파이썬이과학기술컴퓨팅에사용되는이유먼저과학기술컴퓨팅이무엇인지부터알아보자. 과학기술컴퓨팅은다음과같은분야에서수행된다. 공학설계 ( 로켓, 전기제품등 ) 이론물리학 ( 이론의검증, 실증실험결과의분석등 ) 자연과학 ( 수목원구성설계를위한수리최적화등 ) 생명과학 ( 유전자염기서열분석등 ) 의학 ( 영상분석등 ) 이런분야에서는대상이되는제품이나자연현상을수식으로모형화한뒤, 해석적기법이나수치계산을통해이들의거동을예측한다. 또한데이터로부터숨겨진법칙이나특성을찾아내기도한다. 이런일을수행하는처리를과학기술컴퓨팅이라고한다. 과학기술컴퓨팅은 CPU 성능이전체처리성능을결정하는경우가많기때문에아래와같은특성을필요로한다. 64비트운영체제에대응하며메모리를대량으로사용한다 ( 대량의데이터를빠른속도로다루기위해서 ) CPU 자원을집중적으로사용하는처리에강해야한다 ( 고속연산라이브러리가존재 ) 프로그래밍이쉬우며유지보수성도좋아야한다 결과를해석하기위한도구 ( 시각화, 데이터분석 ) 가풍부해야한다물론분야마다필요한조건이다르겠지만위와같은요소를충족하는도구라면과학기술컴퓨팅에적합하다고할수있을것이다. 파이썬은이들요소를모두만족하므로많은사람의지지를받고있다. 1.3 과학기술컴퓨팅과파이썬의관계 17
파이썬의보급도이용하는도구를선택할때생각해야할중요한요소중하나로얼마나많은사용자가이용하고있는가를들수있다. 이용자수가적은도구는나중에지원이중단될우려도있고, 그도구를사용하기위한노하우역시얻기어렵다는문제가있다. 파이썬의이용실적은아직 C/C++, Fortran, MATLAB 등에비해떨어지지만유럽이나미국을중심으로과학기술컴퓨팅에사용하고있는사용자수가최근급격히증가하고있다는것을 1.1 절에서소개한바있다. 이책에서도소개할 NumPy, SciPy, matplotlib, pandas 등이개발되어널리쓰이게되면서보급이한층더순풍을타고있다. 쉬운사용파이썬의보급에는사용하기쉽다는점또한중요하게작용한다. 최근파이썬은매우쉽게사용할수있는언어가되었다. 플랫폼을타지않으며 64비트운영체제도잘지원한다. 과학기술컴퓨팅을위한패키지가잘갖춰져있으며 NumPy 와같은라이브러리는고속으로동작하는수치연산라이브러리에미리링크된패키지상태로배포된다. 그리고이들을한꺼번에설치할수있는배포패키지도잘되어있다. 예전에는설치시패키지의의존성문제를해결하느라골치를앓는경우가많았지만지금은그런번거로운환경구축작업이필요하지않게되었다. 1.3.2 왜파이썬을사용하는가지금까지과학기술컴퓨팅에서파이썬의입지와그배경에대해서설명했다. 개발환경을쉽게갖출수있게된점이나무료로자유롭게사용할수있다는점등을설명했으나과학기술컴퓨팅에파이썬이쓰이는이유가이것만은아니다. 파이썬이과학기술컴퓨 팅에사용되는이유가무엇일까? 우선목적을빨리달성할수있기때문일것이다. 여기에는다음과같은요인이있다. 가독성이좋고유지보수성이뛰어나다 ( 자신이예전에작성한프로그램이나다른사람이작성한프로그램을이해하기쉽다 ) 18 CHAPTER 1 과학기술컴퓨팅과파이썬
동작하는프로그램을빠른시간내에작성할수있다 NumPy나 Cython(12.1절참조 ) 을사용해서실행속도를높일수있다프로그램의작성과정을쫓아가며위의세가지요인에대해생각해보자. 먼저, 그림 1.5 에프로그래밍과정을요약한도식을실었다. 고객에게납품하기위한소프트웨어를작성하는경우에는이것보다더본격적인개발기법을적용하겠지만, 개인이나소규모개발팀이어떤설계혹은분석용프로그램을구축하는경우에는이런간략한흐름을따르게된다. 그림 1.5 에서보듯먼저시스템설계를해야한다. 목적은?, 설계기법은?, 기대하는결과는? 이라는물음에답할수있어야한다. 시스템설계 코드작성 버그수정유지보수변경 테스팅 설계결과확인 1 5 그다음에는실제프로그램을작성한뒤프로그램의동작을테스트한다. 통상적으로는간단한단위테스트와출력을예상할수있는입력으로전체시스템의동작을확인하는정도가될것이다. 이과정에서가장중요한요소중하나가앞서설명한 가독성및유지보수성이뛰어날것 이라는점이다. 자신이작성한프로그램도시간이지나면무슨내용인지알수없게되는일이자주있다. 다른사람이작성한코드라면더더욱그러하다. 그러나가독성이뛰어난프로그램이라면코드의내용을곧바로이해할수있기때문에개발이어렵지않게진행된다. 프로그램코드를읽는시간은대체로코드를작성하는시간보다길기마련이다. 그렇기때문에프로그래밍언어에있어가독성이좋다는것은매우중요한요소가된다. 이어서그림 1.6 의구성요소를갖는프로그램을예로파이썬을사용하는것이얼마나유용할수있는지살펴보자. 그림 1.6 을보면어떤 ❶사용자인터페이스, ❷처리를제어하는 1.3 과학기술컴퓨팅과파이썬의관계 19
부분, ❸ 수치처리프레임워크, ❹ 메인처리부분, ❺ 처리결과를저장하는부분, ❻ 처리 결과를시각화하는기능을갖도록구성되어있다. 이들구성요소를모두단시간에개발할 수있다면 동작하는프로그램을빨리작성할수있는 언어라고할수있을것이다. ❹ 메인처리 처리결과저장 ❺ ❸ 수치처리프레임워크 시각화 ❻ ❷ 처리제어 ❶ 사용자인터페이스 사용자입력 출력 1 6 파이썬의경우 ❶에해당하는사용자인터페이스구축을위해 Tkinter나 Qt 등의 GUI(Graphic User Interface) 프레임워크 18 를쉽게사용할수있게되어있다. ❷번부분에서처리의제어는어떤언어를사용하든난이도가크게변하지않을것이다. ❸번에들어갈수치처리프레임워크는 NumPy가있으므로쉽게고속수치처리프로그램을작성할수있다. ❹번에해당하는메인처리부분역시다양한패키지 ( 라이브러리 ) 가준비되어있다. 예를들어, 천문학분야라면 astropy 19 를사용하면해당분야에서자주쓰이는처리를쉽게구현할수있다. ❺에해당하는처리결과저장도 6장 입력과출력 에서소개하겠지만매우간단하게다양한데이터형식으로저장할수있다. ❻처럼분석결과를시각화하는처리에도 matplotlib 을비롯하여강력한데이터시각화도구가준비되어있다. 이렇듯프로그램의각처리요소별로살펴봐도각각의요소를파이썬으로쉽게구현할수있기때문에목적을재빨리달성할수있다. 18 Tkinter 는 Tk GUI 툴킷에대한인터페이스로파이썬표준라이브러리에포함되어있다. Qt 도 GUI 툴킷의기능을제공하지만단지그정도에머무르지않고 애플리케이션프레임워크 의기능또한갖고있다. Qt 를상업적으로이용하려는경우에는라이선스에주의가필요하다. 19 URL http://www.astropy.org/ 20 CHAPTER 1 과학기술컴퓨팅과파이썬
1.3.3 SciPy Stack 과학기술컴퓨팅에는 SciPy Stack 이라통틀어불리는도구들이주로사용된다. 20 SciPy 라고만하면라이브러리패키지 SciPy만을가리키는경우와이 SciPy Stack 을가리키는경우로나뉘는데, 이책에서는라이브러리패키지 SciPy만을가리키는의미로사용할것이다. 특별히구별할필요가있는경우에는 SciPy Library 및 SciPy Stack 이라부를것이다. SciPy Stack의핵심이되는패키지들을그림 1.7 에실었다. 그림 1.7 에서 matplotlib 이 NumPy 의위에그려져있는이유는 matplotlib 이 NumPy 에의존하고있다는것을나타낸다 ( 다시말해, NumPy가설치되어있지않으면동작하지않는다 ). 마찬가지로 pandas는 SciPy Library에의존하고있지만 SymPy는 NumPy에의존하지않는다. IPython은과학기술컴퓨팅을효율적으로수행하기위해빼놓을수없는사용자인터페이스 ( 셸 ) 로 SciPy Stack 이외의패키지에대한의존관계를갖지않는다. SciPy Stack IPython( 인터프리터셸 ) pandas SciPy Library matplotlib NumPy SymPy nose Python 1 7 SciPy Stack SciPy Stack 패키지는모두무료로사용할수있는오픈소스소프트웨어다. 각각의패키 지에대한간략한설명을표 1.5 에실었다. 20 SciPy 에대한자세한내용은다음 URL 을참조하기바란다. URL http://www.scipy.org/about.html 1.3 과학기술컴퓨팅과파이썬의관계 21
1 5 SciPy Stack 패키지명 설명 Python 파이썬본체 ( 대개의경우 CPython 을가리킨다.) NumPy SciPy Library matplotlib pandas SymPy IPython nose 배열이나행렬의기본데이터타입과이들에대한연산을정의한수치계산용기본패키지 수치계산알고리즘과특정분야를위한툴박스등을모아놓은것. 신호처리, 최적화, 통계처리등에대한도구를포함하고있다. 통상적으로 SciPy 라고만하면이것을가리킨다. 인쇄물수준의고품질 2 차원플로팅및기본적인수준의 3 차원플로팅기능을제공하는패키지 데이터분석에서위력을발휘하는데이터구조및데이터조작함수를제공하는패키지 수식처리시스템 (Computer Algebra System, CAS) 을제공하는패키지 대화형인터페이스를제공하는인터페이스셸 파이썬프로그램의테스트를위한프레임워크 표 1.5 에포함된패키지외에도 Chaco, MayaVi, Cython, SciKits 21, h5py( 뒤에설명함 ), PyTables( 계층구조를갖는데이터를조작하기위한라이브러리 ) 등도 SciPy Stack 의일부로여겨지고있다. SciPy Stack 은과학기술컴퓨팅에필요한다양한기능을제공하고있으므로파이썬을통한과학기술컴퓨팅분야에서는이를사용하는것이당연시되고있다. 민간기업과커뮤니티파이썬이과학기술컴퓨팅에서더많이쓰이게되는이유가하나더있다. 관련된민간기업과커뮤니티의존재다. 일반적으로오픈소스프로젝트는개발리소스 ( 주로인력 ) 가제한적이며개발의중심이되는멤버가어떤이유로빠지게된경우급격히프로젝트가쇠퇴하는경우가있다. 이에비해파이썬은귀도반로섬이개발에참여하고있는한파이썬본체의구현일정에는문제가없을것이고그렇지않더라도 PSF(Python Software Foundation) 를중심으로개발이계속될것이라신뢰할수있다. 그리고대부분의표준라이브러리나패키지, 특히과학기술컴퓨팅과관계깊은패키지의개발에는민간기업의본격적인지원을받으며오픈소스소프트웨어로공개하는체제가구축되어있으므로향후의개발에대해서는낙관적으로봐도될것이다. 이런민간기업중대표격이 Enthought와 Continuum Analytics 다. 21 자세한사항은다음 URL 에있는모든패키지의인덱스를참조하기바란다. URL http://scikits.appspot.com/scikits 22 CHAPTER 1 과학기술컴퓨팅과파이썬
Enthought는 2001년미국에서설립된민간기업이다. 파이썬을이용한과학기술컴퓨팅에특화된도구나컨설팅및교육을제공하고있다. 앞에서설명한과학기술컴퓨팅전용패키지그룹인 SciPy Stack 을주도적으로정비하고발전시키는역할을하고있다. 직원이자신의업무로 NumPy 등을개발하고있으므로이회사가사라지지않는한 SciPy Stack의개발은앞으로도활발하리라예상할수있다. Enthought는미국에서 SciPy Conference 라는행사를창설하고과학기술컴퓨팅에대한파이썬의이용을촉진하면서커뮤니티와의정보공유에도중요한역할을하고있다. Enthought Canopy라는배포패키지를배포하고있으며그중 Express 버전은일부기능이제한되었지만무료로사용할수있다. Continuum Analytics는데이터처리분야에서파이썬을발전시키는데주력하고있는미국기업이다. 사업모델은 Enthought와같이고성능도구나컨설팅및교육을제공하는사업을통해이익을낸다. Continuum Analytics 가무료로제공하고있는배포패키지는 Anaconda라고하는데대규모데이터처리, 예측분석 (predictive analysis), 과학기술컴퓨팅에특화된기능을제공하는 400개이상 (Anaconda 4.1.1 기준 ) 의패키지를포함하고있다. 이들패키지는기업이상업적으로이용할수도있다. 22 이기업도 NumPy, pandas, Blaze, Bokeh, Numba, IPython( 모두뒤에설명함 ) 등의오픈소스패키지개발에크게공헌하고있으며, 과학기술분야에서의파이썬의이용을촉진하고있는큰요인중하나가되고있다. 그리고 Continuum Analytics 도미국에서 PyData 라는컨퍼런스의스폰서를맡아데이터분석에파이썬을사용하는사람들의커뮤니티를지원하고있다. 파이썬과관련된컨퍼런스는위에서설명한 SciPy Conference 나 PyData 외에도 PyCon 이라는컨퍼런스가있다. PyCon은과학기술컴퓨팅이나데이터분석분야뿐만아니라파이썬전반을주제로하는회의다. PyCon은커뮤니티의뜻에따라운영되고있으며일본에서도 PyCon JP 라는이름으로같은형식의컨퍼런스가열리고있다. 이렇듯파이썬이라는언어를어떻게활용할지를주제로많은컨퍼런스가열리고있으며민간기업도커뮤니티를후하게지원하는형식으로기술혁신이진행되고있다. 이로부터 22 자세한사항은다음 URL 에서 Continuum Analytics 의홈페이지를참조하기바란다. URL https://www.continuum.io/ 1.3 과학기술컴퓨팅과파이썬의관계 23
과학기술컴퓨팅에대한파이썬의이용도더욱늘어날것이라예상할수있다. 파이썬의활용사례과학기술컴퓨팅분야에서파이썬의활용사례를살펴보자. NASA( 미항공우주국 ) 에서도 SunPy 23 와같은프로젝트에서사용하고있다. 이외에도 NASA의스페이스셔틀사업의참가하기도했던 United Space Alliance(USA) 의성공적인적용사례도소개된바 24 있다. 또다른예로는파이썬을접착제언어로서의특징을살려프로그램의일부를파이썬으로개발한사례가다수있다. 일본에서는고에너지가속기연구기구에서고에너지가속기제어시스템에사용된사례가잘알려져있지만대부분의구성요소는 EPICS(Experimantal Physics and Industrial Control System) 로개발되었으며파이썬은제어애플리케이션의 GUI를만드는데쓰였다. 25 필자가종사하고있는분야에서는 GNU Radio라는파이썬으로개발된자유소프트웨어 (Free Software) 가사용된다. GNU Radio는소프트웨어무선 26 만을위한전용소프트웨어툴킷으로전파에대한베이스밴드처리를소프트웨어로구현한것이다. GNU Radio 는주로 C++ 과파이썬으로개발되었는데, 빠른속도가필요한신호처리부분은 C++ 로작성되었고이를파이썬으로작성된프로그램쪽에서호출하는구조로되어있다. 파이썬으로도프로그램을어떻게작성하느냐에따라 ( 이후절에서설명하듯 ) 상당한고속처리가가능한프로그램을작성할수있지만, 5년내지 10년정도되는상당한역사를가진프로젝트에서는접착제언어로서사용되는사례가많다. 1.3.4 파이썬은정말속도가느린가파이썬은일반적으로속도가느리다는평가를받고있다. 실제로도그런지확인해보자. 모든언어를공정하게성능을평가한다는것은상당히어려운일이지만여기서는아래와같은간단한행렬계산을예를들어확인하려고한다. 23 URL http://sunpy.org/ 24 URL https://www.python.org/about/success/usa/ 25 자세한사항은다음 URL을참조하기바란다. URL http://www.python.org/zope/zope/casestudy/1500 26 software defined radio라고도한다 24 CHAPTER 1 과학기술컴퓨팅과파이썬
M s ij = a k x ik y kj 1 1 k=1 이때 S, X, Y, A 는다음과같이정의하며, S = X = Y = s 11 s 12 s 1L s 21 s 22 s 2L...... s N1 s N2 s NL x 11 x 12 x 1M x 21 x 22 x 2M...... x N1 x N2 x NM y 11 y 12 y 1L y 21 y 22 y 2L...... y M1 y M2 y ML A =(a 1,a 2,,a M ) N = 10000, M = 1000, L = 10000 으로한다. 이계산의실행속도를파이썬과 C 에서비 교한결과를표 1.6 에실었다. 1 6 C 언어 C 파이썬기본기능만파이썬 + NumPy 속도 409 초 120,000 초 5 초 이번에나온결과를보면파이썬이기본기능만으로큰행렬을계산하면 C보다터무니없이많은시간이걸리지만, 과학기술컴퓨팅분야표준적인라이브러리인 NumPy를사용하면코드의양도대폭줄어들거니와실행속도또한 1만배이상빨라진다. 그리고 C보다도빠른계산속도가나온것을알수있다. 과학기술분야의수치계산에서실행속도가문제가되는것은이예제와같이합곱연산을매우많이반복하는경우인데, 이결과만보면파이썬과 NumPy를같이사용하는한실행속도면에서의큰문제는없다고할수있다. 1.3 과학기술컴퓨팅과파이썬의관계 25
성능비교의세부사항이벤치마크테스트를수행한환경을살펴보자. 동작환경은다음과같다. 운영체제 : 윈도우 8.1 CPU: Intel Core i5 4200M 2.5GHz C 컴파일러 : Cygwin gcc 4.8.2 (x86-64) 파이썬 : Ver 3.5.2(IPython 4.2.0, 64bit) NumPy: Ver 1.11(MKL 11.3도함께사용 ) 다음으로벤치마크테스트에사용된 C 프로그램을리스트 1.4 에실었다. 이프로그램은힙메모리 27 를사용하면실행속도가느려지므로큰배열을지역변수로만들어스택에두었다. 스택의크기는대체로그리크지않으므로아무대비를하지않으면오류가발생하게된다. 그래서컴파일할때다음과같은옵션을준다. > gcc -O3 -o c_bench -Wl,--stack,1000000000 c_bench1.c -Wl,.stack, 1000000000 부분은링커 28 에게스택메모리로확보할메모리크기를지정 해준다. -O3 는컴파일할때의최적화옵션이다. 1 4 C #include <stdio.h> #include <windows.h> #include <stdlib.h> const int N = 10000; const int M = 1000; const int L = 10000; int main(int argc, char** argv) { int i, j, k; double a[m], S[N][L], x[n][m], y[m][l]; LARGE_INTEGER start_pc, end_pc, freq_pc; 27 칼럼 스택메모리와힙메모리 를참조하기바란다. 28 링커 (linker) 는컴파일결과에필요한라이브러리등을연결해서실행파일로만들어주는프로그램을말한다. 26 CHAPTER 1 과학기술컴퓨팅과파이썬
/* ❶ 배열의각요소에값을설정 */ srand(1); double rnd_max = (double) RAND_MAX; for (i=0; i<m; i++) { a[i] = (rnd_max*0.5 - rand()) / rnd_max; } for (i=0; i<n; i++) { for (j=0; j<m; j++) { x[i][j] = (rnd_max*0.5 - rand()) / rnd_max; } } for (i=0; i<m; i++) { for (j=0; j<l; j++) { y[i][j] = (rnd_max*0.5 - rand()) / rnd_max; } } for (i=0; i<n; i++) { for (j=0; j<l; j++) { S[i][j] = 0.0; } } /* ❷ 처리를시작한시각을측정 */ QueryPerformanceFrequency( &freq_pc ); QueryPerformanceCounter( &start_pc ); /* ❸ 식 1.1 과같이행렬계산을수행 ( 처리시간측정대상 ) */ for (i=0; i<n; i++) { for (j=0; j<l; j++) { for (k=0; k<m; k++) { S[i][j] += a[k]*x[i][k]*y[k][j]; } } } /* ❹ 처리완료된시각을측정 */ QueryPerformanceCounter( &end_pc ); double sec_pc = (end_pc.quadpart - start_pc.quadpart) / (double)freq_pc.quadpart; printf(" 계산시간 = %.3lf[ms]\n", sec_pc * 1000); /* ❺ 컴파일러최적화로인해계산이생략되지않도록계산후에무작위로결과에접근 */ i = (int) (start_pc.quadpart % N); j = (int) (end_pc.quadpart % L); printf("s[%d][%d] = %.3lf\n", i, j, S[i][j]); } return 0; 1.3 과학기술컴퓨팅과파이썬의관계 27
리스트 1.4 를보면 ❶에서계산할배열값을설정하고, ❷에서계산을시작할시점의시각을측정한뒤, ❸부분에서식 1.1 계산을실제수행하고, ❹에서는계산이종료된시점의시각을측정한다. 또, 컴파일러의최적화옵션으로인해일부계산이생략되는일이없도록 ❺에서계산결과에무작위로접근하는과정을추가했다. 이번에는 BLAS(Basic Linear Algebra Subprogram) 29 나, SIMD(11장에서설명 ) 를사용하지않았으므로이들을이용해서프로그램을작성하면더속도를올릴수있다. 이번에는파이썬프로그램을살펴보자. 리스트 1.5 에조금전의 C 프로그램과동등한계산을수행하는프로그램을실었다. 먼저 C 프로그램과같은내용의계산을그대로작성해서함수 mult_basic 을정의했다. 이함수는 NumPy 의행렬연산기능을사용하지않고파이썬의 for문으로구현되었기 ( 앞에나온표 1.6 에서 파이썬기본기능만 에해당 ) 때문에처리속도가늦으리라예상할수있다. 그래서그뒤에 NumPy의연산기능을최대한활용한함수 mult_fast 를작성했다. 이함수는 mult_basic 과완전히같은내용의계산을 NumPy를이용해서구현한것이다. NumPy를사용하면이예제에서보듯간결한코드를작성할수있다. 거기다눈치채지도못한사이에수치연산라이브러리 (BLAS 등 ) 를사용하여고속으로계산을수행하게된다. 이벤치마크테스트에서는빠른수치연산라이브러리를사용하고있지않기때문에 C 프로그램쪽이불리한조건을안고있다. 그러나여기서중요한것은파이썬으로도수치연산라이브러리를명시적으로사용한것은아니라는점이다. 파이썬에서 NumPy 등을사용하면자동적으로이들라이브러리를사용할수있다. 1 5 import numpy as np import time def mult_basic(n, M, L, a, x, y): """ 행렬계산을사용하지않고 for 문으로사용해서계산하는함수단, ndarray 를사용하지않으면배열을원하는크기로만들기가어렵기때문에입력변수는 NumPy 의 ndarray 로만들어넘긴다. """ 29 선형대수를위한수치계산라이브러리. BLAS 의구현에는 OpenBLAS, ATLAS(Automatically Tuned Linear Algebra Software), LAPACK(Linear Algebra PACK-age), Intel MKL(Math Kernel Library) 등이있다. 28 CHAPTER 1 과학기술컴퓨팅과파이썬
r = np.empty((n, L)) for i in range(n): for j in range(l): tmp = 0.0 for k in range(m): tmp = tmp + a[k]*x[i][k]*y[k][j] r[i][j] = tmp return r def mult_fast(n, M, L, a, x, y): """ NumPy 의함수를사용한고속계산함수함수 mult_basic 과같은결과를얻는다. """ return np.dot(x*a, y) # 한줄로처리할수있다. if name == ' main ': # 계산대상이되는배열생성 np.random.seed(0) N = 10000 M = 1000 L = 10000 a = np.random.random(m) - 0.5 x = np.random.random((n, M)) - 0.5 y = np.random.random((m, L)) - 0.5 # 행렬계산을사용하지않고 for 문사용 ts = time.time() r1 = mult_basic(n, M, L, a, x, y) te = time.time() print("basic method : %.3f [ms]" % (1000*(te - ts))) # NumPy 를사용한고속계산 ts = time.time() r2 = mult_fast(n, M, L, a, x, y) te = time.time() print("fast method : %.3f [ms]" % (1000*(te - ts))) column C 같은컴파일언어, 다시말해실행하기전에프로그램을컴파일해야하는언어에대해이야기하려면먼저스택메모리 (stack memory) 와힙메모리 (heap memory) 라는두종류의메모리에대해서알아둘필요가있다. 스택메모리와힙메모리는모두프로그램안에서일시적으로사용하는메모리로대개의경우 RAM(Random Access Memory) 상어딘가에저장된다. 이들두가지메모리의차이를간단히설명하면다음과같다. 스택메모리는컴파일러나운영체제가자동적으로할당하거나해제하는메모리를말한다. 스택메모리의크기는프로그램을컴파일및링크하는시점에이미결정되어있으며이를바꿀수없다. C의 1.3 과학기술컴퓨팅과파이썬의관계 29
경우는 자동변수 에속하는변수 ( 함수안에서정의된지역변수등 ) 가스택메모리에저장된다. 아래에 그예를들겠다. double times_n(int n) { int i, sum=0; // ❶ double b[3] = {1.1, 2.1, 3.4}; // ❷ } for (i=0; i < 3; i++) { sum += b[i] * n; } return sum; 함수 times_n에서는정수 i와 sum, 그리고배정밀도부동소수 (double) 의배열 b를사용하겠다고선언하고있다 (❶, ❷). 이변수들은이함수안에서만사용할수있는지역변수다. 이함수를호출하면자동적으로메모리에할당되며함수가종료되면역시자동적으로버려진다. 그런변수를 자동변수 라고부르며스택메모리에저장된다. 이번에는힙메모리의사례를살펴보자. 아래의코드를보기바란다. double* setvec(int n_size) { int i; double *vec; vec = (double *) malloc(sizeof(double) * n_size); // ❸ for (i=0; i<n_size; i++) { vec[i] = 1.01 * i; } } return vec; 이프로그램에서는함수 setvec의인자로 n_size가주어지며이값을크기로하는배정밀도부동소수타입 (double) 의배열이 ❸에서할당된다. 필요한배열의크기를미리알수없는경우에는이예제에서보듯 malloc 같은함수를사용하여동적으로메모리를할당받는다. 이때이변수가저장되는영역은힙메모리로부터할당된다. 일반적으로크기가큰변수나메모리를동적으로할당받아야하는변수는힙메모리에저장되고, 그외의경우는스택메모리에저장된다고보면된다. 이에비해파이썬에서는 C처럼스택이나힙이프로그래머에게노출되지않는다. 메모리전반을확보하는데신경을써야할경우는있지만메모리에대한세부사항을신경쓸필요가거의없기때문에파이썬을익히기쉬운언어라고하는것이다. 30 CHAPTER 1 과학기술컴퓨팅과파이썬
1.4 정리 세계적인추세를보면파이썬은단지교육용언어로만주목받는것이아니라과학기술컴퓨팅분야에서도널리쓰이고있는언어다. 실제로파이썬이대두하고있는양상은여러가지데이터를봐도알수있다. 이에비해일본에서는과학기술컴퓨팅분야에서아직활발하게쓰이고있는단계는아니지만해외의사례가속속전해지면서인기도가상승하고있다. 그리고그근거로파이썬의뛰어난언어적특성과과학기술컴퓨팅에대한이용을촉진할만한규모의생태계가존재한다는것을설명했다. 파이썬의속도가느리다는오해에대해서는 NumPy 를사용한프로그램을반례로제시했다. 적절한라이브러리만함께사용할수있다면파이썬은 C에도뒤지지않을정도의실행속도를얻을수있다. 이렇듯과학기술컴퓨팅분야에서도적절하게사용한다면파이썬은강력하고효율적인도구가될수있다. 앞으로의장에서는프로그래밍에필요한기본사항 (2장, 3장 ), 언어의스펙 (4~6 장 ), 주요라이브러리 (7~10장), 고속계산 / 최적화기법 (11장, 12장 ) 을소개할것이다. 파이썬의힘을충분히끌어내기위한기초지식을탄탄히다져가도록하자. 1.4 정리 31