본문 바로가기

카테고리 없음

고성능 파이썬


파이썬은 GIL 때문에 느리다는 고급 개발자들의 얘기가 있습니다. 뭐 코더가 아닌 이상 제가 뚝딱 거리는 프로그램은 아직까지 전체적으로 느리다는 느낌은 없지만 몇몇 순간에는 조금 빨리 처리되었으면 하는 바람이 있네요. 거의 동시에 수행되거나 병렬적으로 처리되면 좋을 작업들이 있는데 GIL 제약 때문에 어떻게 해야 하는지 모르겠어요. 그래서 이런 책을 필요로 하게 되었고 공부는 하고 있지만 어려운 건 어쩔 수 없네요. 어차피 CPU 성능이 어마어마한 요즘 어지간한 경우에 연산 자체의 성능이 모자라진 않을 겁니다. 대부분의 경우에 병목은 멀티쓰레드 사이에 GIL 오버헤드나 입출력 지연, 메모리 문제, 타 연산결과 기다리기 같은 데서 발생할 거라는 생각인데, 그런 병목은 코드를 어떻게 짜느냐, 실력의 문제가 될 것입니다. 그런 점에서 이 책이 적절한 해답을 제공해주었으면 합니다.
파이썬의 생산성에 컴파일 언어의 성능을 더하다파이썬은 느리다? 이 책은 파이썬의 단 하나의 약점, 성능 문제를 해결해주는 다양한 전략을 소개한다. 파이썬의 관점에서 바라보는 컴퓨터 아키텍처와 동작 원리를 기본으로 깔고, 각종 라이브러리의 올바른 활용법, 행렬과 벡터 연산 가속, 메모리를 효율적으로 쓰는 법, 병목을 찾는 습관과 도구, 네이티브 코드로 컴파일하기 등을 배우고, 파이썬을 성공적으로 도입한 업계 선배들의 경험담과 전략을 듣게 될 것이다. 특히 한국어판에서는 저자의 동의를 얻어 파이썬 2로 작성된 원서의 예제 코드를 파이썬 3에서 실행할 수 있도록 수정하였다.

1장. 고성능을 위한 파이썬 이해하기__1.1 컴퓨터 시스템의 기본__1.2 기본 구성 함께 보기__1.3 파이썬을 쓰는 이유2장. 프로파일링으로 병목 지점 찾기__2.1 효과적으로 프로파일링하기__2.2 쥘리아 집합__2.3 전체 쥘리아 집합 계산하기__2.4 시간을 측정하는 간단한 방법 - print와 데코레이터__2.5 유닉스 time 명령어를 이용한 간단한 시간 측정__2.6 cProfile 모듈 사용하기__2.7 line_profiler로 한 줄씩 측정하기__2.8 memory_profiler로 메모리 사용량 진단하기__2.9 heapy로 힙 메모리 살펴보기__2.10 dowser로 변수 생성을 실시간으로 확인하기__2.11 dis 모듈로 CPython의 바이트코드 조사하기__2.12 최적화 중에 단위 테스트하기__2.13 성공적인 코드 프로파일링 전략__2.14 마치며3장. 리스트와 튜플__3.1 더 효율적인 탐색__3.2 리스트와 튜플__3.3 마치며4장. 사전과 셋__4.1 사전과 셋의 동작 원리__4.2 사전과 네임스페이스__4.3 마치며5장. 이터레이터와 제너레이터__5.1 무한급수와 이터레이터__5.2 제너레이터의 지연 실행__5.3 마치며6장. 행렬과 벡터 연산__6.1 문제 소개__6.2 파이썬의 리스트만으로 충분할까?__6.3 메모리 단편화__6.4 numpy를 이용한 확산 방정식 해법__6.5 numexpr : 제자리 연산을 더 빠르고 간편하게 쓰기__6.6 최적화 검증 scipy__6.7 마치며7장. C 언어로 컴파일하기__7.1 가능한 속도 개선의 종류__7.2 JIT 대 AOT 컴파일러__7.3 타입 정보가 실행 속도에 영향을 주는 이유__7.4 C 컴파일러 사용하기__7.5 쥘리아 집합 예제 다시 보기__7.6 Cython__7.7 Shed Skin__7.8 Cython과 numpy__7.9 Numba__7.10 Pythran__7.11 PyPy__7.12 각 기술을 언제 사용할까?__7.13 외부 함수 인터페이스__7.14 마치며8장. 동시성__8.1 비동기 프로그래밍 소개__8.2 순차적 크롤러__8.3 gevent__8.4 tornado__8.5 AsyncIO__8.6 데이터베이스 예제__8.7 마치며9장. multiprocessing 모듈__9.1 multiprocessing 모듈 소개__9.2 몬테카를로 방식을 사용해 원주율 추정하기__9.3 프로세스와 스레드를 사용해 원주율 추정하기__9.4 소수 찾기__9.5 프로세스 간 통신을 사용해 소수 검증하기__9.6 multiprocessing과 numpy 데이터 공유하기__9.7 파일과 변수 접근 동기화하기__9.8 마치며10장. 클러스터와 작업 대기열__10.1 클러스터링의 이점__10.2 클러스터링의 단점__10.3 일반적인 클러스터 설계__10.4 클러스터화한 해법을 어떻게 시작할 것인가?__10.5 클러스터 사용 시 고통을 피하는 방법__10.6 세 가지 클러스터링 솔루션__10.7 강건한 프로덕션 클러스터링을 위한 NSQ__10.8 살펴볼 만한 다른 클러스터링 도구들__10.9 마치며11장. RAM 아껴 쓰기__11.1 원시 타입 객체는 비싸다__11.2 컬렉션이 사용하는 RAM 이해하기__11.3 바이트와 유니코드__11.4 RAM에 수많은 텍스트를 효율적으로 저장하기__11.5 RAM을 덜 사용하기 위한 팁__11.6 확률적 자료구조12장. 현장에서 얻는 교훈__12.1 어댑티브랩의 소셜 미디어 분석, 소마(SoMA)__12.2 RadimRehurek.com의 딥 러닝, 플라이(Fly)__12.3 Lyst.com의 대규모 기계 학습__12.4 스메시에서의 대규모 소셜 미디어 분석__12.5 성공적인 웹과 데이터 처리 시스템을 위한 PyPy__12.7 Lanyrd.com의 작업 대기열