고성능 파이썬(2판)

Book description

파이썬 코드가 제대로 동작하더라도 더 빠르게 실행되도록 해야 할 때가 있다. 이 책은 파이썬 3에 맞춰 내용을 보강한 개정판으로, 처리할 데이터 용량이 큰 프로그램의 병목현상을 찾고, 이를 해결해 성능을 향상하는 방법을 알려준다. 프로그램 설계 시 여러 선택 사항의 기반이 되는 자세한 설명 덕분에 파이썬 구현을 더 깊이 이해할 수 있다. 멀티 코어 아키텍처나 클러스터를 어떻게 활용할 수 있을까? 신뢰성을 잃지 않으면서 규모를 쉽게 확장하고 축소할 수 있는 시스템을 어떻게 구축할 수 있을까? 경험이 많은 파이썬 프로그래머라면 이 책을 통해 다양한 문제에 대한 구체적인 해결 방법을 배울 수 있고 소셜 미디어 분석, 프로덕션 수준의 머신러닝 분야에서 여러 기업이 겪은 무용담도 엿볼 수 있다.

Table of contents

  1. 지은이·옮긴이 소개
  2. 추천사
  3. 옮긴이의 말
  4. 이 책에 대하여 (1/3)
  5. 이 책에 대하여 (2/3)
  6. 이 책에 대하여 (3/3)
  7. 제1장 고성능 파이썬 이해하기
    1. 1.1 기본 컴퓨터 시스템
      1. 1.1.1 연산 장치
      2. 1.1.2 메모리 장치
      3. 1.1.3 통신 계층
    2. 1.2 기본 요소 조합하기
      1. 1.2.1 이상적인 컴퓨팅 vs. 파이썬 가상 머신
    3. 1.3 파이썬을 쓰는 이유
    4. 1.4 뛰어난 성과를 거두는 파이썬 프로그래머가 되는 방법
      1. 1.4.1 모범적 작업 절차
      2. 1.4.2 주피터 노트북 잘 다루기
      3. 1.4.3 일하는 즐거움 되찾기
  8. 제2장 프로파일링으로 병목 지점 찾기
    1. 2.1 효과적으로 프로파일하기
    2. 2.2 줄리아 집합
    3. 2.3 전체 줄리아 집합 계산하기
    4. 2.4 시간을 측정하는 간단한 방법: print와 데커레이터
    5. 2.5 유닉스 time 명령어를 이용한 간단한 시간 측정
    6. 2.6 cProfile 모듈 사용하기 (1/2)
    7. 2.6 cProfile 모듈 사용하기 (2/2)
    8. 2.7 SnakeViz로 cProfile 결과 시각화하기
    9. 2.8 line_profiler로 한 줄씩 측정하기 (1/2)
    10. 2.8 line_profiler로 한 줄씩 측정하기 (2/2)
    11. 2.9 memory_profiler로 메모리 사용량 진단하기 (1/2)
    12. 2.9 memory_profiler로 메모리 사용량 진단하기 (2/2)
    13. 2.10 PySpy로 기존 프로세스 살펴보기
    14. 2.11 바이트코드: 내부 작동
      1. 2.11.1 dis 모듈로 C파이썬의 바이트코드 조사하기
      2. 2.11.2 접근 방법에 따라 달라지는 복잡도
    15. 2.12 최적화 중에 단위 테스트하기
    16. 2.13 성공적인 코드 프로파일링 전략
    17. 2.14 맺음말
  9. 제3장 리스트와 튜플
    1. 3.1 더 효율적인 탐색
    2. 3.2 리스트와 튜플
      1. 3.2.1 리스트: 동적 배열
      2. 3.2.2 튜플: 정적 배열
    3. 3.3 마치며
  10. 제4장 사전과 셋
    1. 4.1 사전과 셋의 동작 원리
      1. 4.1.1 삽입과 검색
      2. 4.1.2 삭제
      3. 4.1.3 크기 변경
      4. 4.1.4 해시 함수와 엔트로피
    2. 4.2 사전과 네임스페이스
    3. 4.3 마치며
  11. 제5장 이터레이터와 제너레이터
    1. 5.1 이터레이터로 무한급수 표현하기
    2. 5.2 제너레이터의 지연 계산
    3. 5.3 마치며
  12. 제6장 행렬과 벡터 계산
    1. 6.1 문제 소개 (1/2)
    2. 6.1 문제 소개 (2/2)
    3. 6.2 파이썬의 리스트만으로 충분할까?
      1. 6.2.1 너무 잦은 할당의 문제
    4. 6.3 메모리 단편화
      1. 6.3.1 perf 이해하기
      2. 6.3.2 perf 결과 반영하기
      3. 6.3.3 넘파이 입문
    5. 6.4 넘파이를 이용한 확산 방정식 해법
      1. 6.4.1 메모리 할당과 제자리 연산
      2. 6.4.2 선택적인 최적화: 고칠 부분 찾기
    6. 6.5 numexpr: 제자리 연산을 더 빠르고 간편하게 쓰기
    7. 6.6 경고: ‘최적화’ 검증(사이파이)
    8. 6.7 행렬 최적화에서 얻은 교훈
    9. 6.8 팬더스
      1. 6.8.1 팬더스 내부 모델
      2. 6.8.2 여러 데이터 행에 함수 적용하기 (1/2)
      3. 6.8.2 여러 데이터 행에 함수 적용하기 (2/2)
      4. 6.8.3 부분 결과를 이어 붙이지 않고 DataFrame과 Series 만들기
      5. 6.8.4 어떤 일을 하는 또 다른(게다가 더 빠른) 방법
      6. 6.8.5 효율적인 팬더스 개발을 위한 조언
    10. 6.9 마치며
  13. 제7장 C 언어로 컴파일하기
    1. 7.1 가능한 속도 개선의 종류
    2. 7.2 JIT 대 AOT 컴파일러
    3. 7.3 타입 정보가 실행 속도에 영향을 주는 이유
    4. 7.4 C 컴파일러 사용하기
    5. 7.5 줄리아 집합 예제 다시 보기
    6. 7.6 사이썬
      1. 7.6.1 사이썬을 사용하여 순수 파이썬 코드 컴파일하기
    7. 7.7 pyximport
      1. 7.7.1 코드 블록을 분석하기 위한 사이썬 어노테이션
      2. 7.7.2 타입 어노테이션 추가하기
    8. 7.8 사이썬과 넘파이
      1. 7.8.1 한 컴퓨터에서 OpenMP를 사용해 병렬화하기
    9. 7.9 Numba
      1. 7.9.1 Numba를 사용해 팬더스에서 넘파이 컴파일하기
    10. 7.10 PyPy
      1. 7.10.1 가비지 컬렉션 방식의 차이
      2. 7.10.2 PyPy 실행 및 모듈 설치
    11. 7.11 속도 향상 결과 정리
    12. 7.12 각 기술의 사용 시점
      1. 7.12.1 떠오르는 다른 프로젝트들
    13. 7.13 GPU
      1. 7.13.1 동적 그래프: 파이토치
      2. 7.13.2 기본 GPU 프로파일링
      3. 7.13.3 GPU 사용 시 성능상 고려할 점
      4. 7.13.4 GPU 사용 시점
    14. 7.14 외부 함수 인터페이스
      1. 7.14.1 ctypes
      2. 7.14.2 cffi
      3. 7.14.3 f2py
      4. 7.14.4 C파이썬 모듈
    15. 7.15 마치며
  14. 제8장 비동기 I/O
    1. 8.1 비동기 프로그래밍 소개
    2. 8.2 async/await의 동작 방식
      1. 8.2.1 순차적 크롤러
      2. 8.2.2 gevent
      3. 8.2.3 tornado
      4. 8.2.4 aiohttp
    3. 8.3 CPU 공유: I/O 부하
      1. 8.3.1 순차 처리
      2. 8.3.2 일괄 처리
      3. 8.3.3 완전한 비동기 처리 (1/2)
      4. 8.3.3 완전한 비동기 처리 (2/2)
    4. 8.4 마치며
  15. 제9장 multiprocessing 모듈
    1. 9.1 multiprocessing 모듈 소개
    2. 9.2 몬테 카를로 방식을 사용해 원주율 추정하기
    3. 9.3 프로세스와 스레드를 사용해 원주율 추정하기
      1. 9.3.1 파이썬 객체 사용하기
      2. 9.3.2 multiprocessing을 Joblib으로 바꾸기
      3. 9.3.3 병렬 시스템의 난수
      4. 9.3.4 넘파이 사용하기
    4. 9.4 소수 찾기 (1/2)
    5. 9.4 소수 찾기 (2/2)
      1. 9.4.1 작업 큐 (1/3)
      2. 9.4.1 작업 큐 (2/3)
      3. 9.4.1 작업 큐 (3/3)
    6. 9.5 프로세스 간 통신을 사용해 소수 검증하기
      1. 9.5.1 순차적 해법
      2. 9.5.2 단순한 풀 해법
      3. 9.5.3 덜 단순한 풀 해법
      4. 9.5.4 Manager.Value를 플래그로 사용하기
      5. 9.5.5 레디스를 플래그로 사용하기
      6. 9.5.6 RawValue를 플래그로 사용하기
      7. 9.5.7 mmap을 플래그로 사용하기 (1)
      8. 9.5.8 mmap을 플래그로 사용하기 (2)
    7. 9.6 multiprocessing과 넘파이 데이터 공유하기 (1/2)
    8. 9.6 multiprocessing과 넘파이 데이터 공유하기 (2/2)
    9. 9.7 파일과 변수 접근 동기화하기
      1. 9.7.1 파일 락 걸기
      2. 9.7.2 값에 락 걸기
    10. 9.8 마치며
  16. 제10장 클러스터와 작업 큐
    1. 10.1 클러스터링의 이점
    2. 10.2 클러스터링의 단점
      1. 10.2.1 형편없는 클러스터 업그레이드 전략으로 4억 6천2백만 달러를 손해 본월스트리트
      2. 10.2.2 스카이프가 겪은 24시간 동안의 전 세계 서비스 장애
    3. 10.3 일반적인 클러스터 설계
    4. 10.4 클러스터화한 해법을 시작하는 방법
    5. 10.5 클러스터 사용 시 고통을 피하는 방법
    6. 10.6 두 가지 클러스터링 솔루션
      1. 10.6.1 IPython Parallel을 사용해 연구 지원하기
      2. 10.6.2 Dask로 팬더스 병렬화하기
    7. 10.7 강건한 프로덕션 클러스터링을 위한 NSQ
      1. 10.7.1 큐
      2. 10.7.2 출판자/구독자
      3. 10.7.3 분산 소수 계산
    8. 10.8 살펴볼 만한 다른 클러스터링 도구들
    9. 10.9 도커
      1. 10.9.1 도커의 성능
      2. 10.9.2 도커의 장점
    10. 10.10 마치며
  17. 제11장 RAM 덜 사용하기
    1. 11.1 값비싼 원시 타입 객체
      1. 11.1.1 원시 객체를 더 적은 비용으로 저장하는 array 모듈
      2. 11.1.2 NumExpr을 사용해 넘파이에서 RA M 덜 사용하기
    2. 11.2 컬렉션이 사용하는 RAM 이해하기
    3. 11.3 바이트와 유니코드
    4. 11.4 RAM에 많은 텍스트를 효율적으로 저장하기
      1. 11.4.1 토큰 1100만 개를 여러 컨테이너에 넣어보기 (1/2)
      2. 11.4.1 토큰 1100만 개를 여러 컨테이너에 넣어보기 (2/2)
    5. 11.5 사이킷런의 FeatureHasher를 사용해 더 많은 텍스트 모델링하기
    6. 11.6 DictVectorizer와 FeatureHasher
      1. 11.6.1 실제 문제에서 DictVectorizer와 FeatureHasher 비교
    7. 11.7 사이파이의 희소 행렬
    8. 11.8 RAM을 덜 사용하기 위한 팁
    9. 11.9 확률적 자료구조
      1. 11.9.1 1바이트 모리스 카운터를 사용해 대략적으로 개수 세기
      2. 11.9.2 K-최솟값
      3. 11.9.3 블룸 필터 (1/2)
      4. 11.9.3 블룸 필터 (2/2)
      5. 11.9.4 로그로그 카운터
      6. 11.9.5 실전 예제 (1/2)
      7. 11.9.5 실전 예제 (2/2)
  18. 제12장 현장에서 얻은 교훈
    1. 12.1 특성 엔진으로 피처 엔지니어링 파이프라인 흐름 만들기
      1. 12.1.1 머신러닝을 위한 피처 엔지니어링
      2. 12.1.2 피처 엔지니어링 파이프라인 배포 작업의 어려움
      3. 12.1.3 오픈 소스 파이썬 라이브러리의 능력 활용하기
      4. 12.1.4 피처 엔지니어링 파이프라인의 개발과 배포를 원활하게 하는 피처 엔진
      5. 12.1.5 새 오픈 소스 패키지 적용 돕기
      6. 12.1.6 오픈 소스 라이브러리의 개발과 유지 그리고 기여 장려하기
    2. 12.2 고성과 데이터 사이언스 팀
      1. 12.2.1 작업 일정 잡기
      2. 12.2.2 해법 발견과 계획
      3. 12.2.3 예상과 산출물 관리하기
    3. 12.3 Numba
      1. 12.3.1 간단한 예제
      2. 12.3.2 모범 사례와 권장 사항
      3. 12.3.3 도움 얻기
    4. 12.4 최적화 vs. 생각
    5. 12.5 어댑티브 랩의 소셜 미디어 분석, 소마(2014)
      1. 12.5.1 어댑티브 랩에서의 파이썬
      2. 12.5.2 소마의 설계
      3. 12.5.3 개발 방법론
      4. 12.5.4 소마 유지보수
      5. 12.5.5 동료 엔지니어를 위한 충고
    6. 12.6 RadimRehurek.com의 딥러닝 플라이 만들기(2014)
      1. 12.6.1 스위트 스팟
      2. 12.6.2 최적화에서 배운 교훈들
      3. 12.6.3 정리
    7. 12.7 Lyst.com의 대규모 머신러닝(2014)
      1. 12.7.1 클러스터 설계
      2. 12.7.2 빠르게 움직이는 스타트업에서의 코드 진화
      3. 12.7.3 추천 엔진 만들기
      4. 12.7.4 보고와 모니터링
      5. 12.7.5 몇 가지 조언
    8. 12.8 스메시에서의 대규모 소셜 미디어 분석(2014)
      1. 12.8.1 스메시에서 파이썬의 역할
      2. 12.8.2 플랫폼
      3. 12.8.3 고성능 실시간 문자열 매칭
      4. 12.8.4 보고, 모니터링, 디버깅, 배포
    9. 12.9 성공적인 웹과 데이터 처리 시스템을 위한 PyPy(2014)
      1. 12.9.1 선결 조건
      2. 12.9.2 데이터베이스
      3. 12.9.3 웹 애플리케이션
      4. 12.9.4 OCR과 번역
      5. 12.9.5 작업 배분과 작업자
      6. 12.9.6 정리
    10. 12.10 Lanyrd.com의 작업 큐(2014)
      1. 12.10.1 Lanyrd에서 파이썬의 역할
      2. 12.10.2 작업 큐의 성능 개선하기
      3. 12.10.3 보고, 모니터링, 디버깅, 배포
      4. 12.10.4 동료 엔지니어를 위한 조언
  19. INDEX (1/2)
  20. INDEX (2/2)

Product information

  • Title: 고성능 파이썬(2판)
  • Author(s): 오현석, 미샤 고렐릭, 이안 오스발트
  • Release date: May 2021
  • Publisher(s): Hanbit Media, Inc.
  • ISBN: 9791162244210