ハイパフォーマンスPython 第2版

[cover photo]
TOPICS
Programming , Python
発行年月日
PRINT LENGTH
452
ISBN
978-4-87311-990-8
原書
High Performance Python, 2nd Edition
FORMAT
Print PDF EPUB
Ebook
4,290円
Ebookを購入する
Print
4,290円

Pythonの高速化技法を学ぶロングセラー書の改訂版。待望のPython 3対応。本書ではCPUやメモリ使用量の観点からハイパフォーマンスなコードを書くための考え方や手法を解説します。そのために、パフォーマンスのボトルネックを測定する方法から、最適なデータ構造の選択方法、CythonやNumbaなどのコンパイラの比較、非同期処理、マルチコアCPUの活用法といった最適化のノウハウを、シンプルなサンプルプログラムを使って実際に効果を確認しながら学びます。本書で学べる考え方や手法はPython以外にも適用できるので、ハイパフォーマーを目指すプログラマーは必携の一冊です。

関連ファイル

目次

序文
訳者まえがき
まえがき

1章 高性能なPythonを理解する
    1.1 コンピュータシステムの基礎
        1.1.1 演算装置
        1.1.2 記憶装置
        1.1.3 接続レイヤー
    1.2 基本要素を統合する
        1.2.1 理想計算とPython仮想マシン
    1.3 それでもPythonを使う理由
    1.4 パフォーマンスの高いプログラマーになるには
        1.4.1 良い仕事のやり方
        1.4.2 ノートブックの上手な使い方に関する考察
        1.4.3 仕事の楽しさを取り戻すために

2章 プロファイリングしてボトルネックを見つける
    2.1 効率の良いプロファイリング
    2.2 ジュリア集合について
    2.3 ジュリア集合全体を計算する
    2.4 時間計測の簡単な方法――printとデコレータ
    2.5 Unixのtimeコマンドを用いて簡単に時間計測する
    2.6 cProfileモジュールを使う
    2.7 SnakeVizを使ってcProfileの出力を可視化する
    2.8 line_profilerを使って行単位で計測する
    2.9 memory_profilerを使ってメモリ使用を診断する
    2.10 py-spyを使って既存のプロセスを調査する
    2.11 バイトコードを掘り下げる
        2.11.1 disモジュールを使ってCPythonのバイトコードを調べる
        2.11.2 方法が変われば計算量も変わる
    2.12 最適化中に単体テストをして正しさを維持する
        2.12.1 何もしない@profileデコレータ
    2.13 成功するプロファイリング戦略
    2.14 まとめ

3章 リストとタプル
    3.1 より効率的な探索
    3.2 リストとタプルの違い
        3.2.1 動的な配列としてのリスト
        3.2.2 静的な配列としてのタプル
    3.3 まとめ

4章 辞書と集合
    4.1 辞書と集合の動作の仕組み
        4.1.1 追加と検索
        4.1.2 削除
        4.1.3 サイズ変更
        4.1.4 ハッシュ関数とエントロピー
    4.2 辞書と名前空間
    4.3 まとめ

5章 イテレータとジェネレータ
    5.1 ジェネレータと無限数列
    5.2 ジェネレータの遅延評価
    5.3 まとめ

6章 行列とベクトルの計算
    6.1 問題の説明
    6.2 Pythonのリストでは不十分か?
        6.2.1 大量のメモリを確保する問題
    6.3 メモリ断片化
        6.3.1 perfを理解する
        6.3.2 perfの結果を見て判断する
        6.3.3 NumPy入門
    6.4 拡散問題にNumPyを適用する
        6.4.1 メモリ確保とインプレース演算
        6.4.2 最適化を選択する:何を修正すべきかを見つける
    6.5 NumExpr:インプレース演算を簡潔に高速化する
    6.6 訓話:最適化を検証しよう(SciPy)
    6.7 行列最適化からの教訓
    6.8 Pandas
        6.8.1 Pandasの内部モデル
        6.8.2 多数の行のデータに関数を適用する方法
        6.8.3 DataFrameやSeriesの構築に連結は使わない
        6.8.4 たいていの仕事にはより速い方法がある
        6.8.5 効率的な開発のためのアドバイス
    6.9 まとめ

7章 Cにコンパイルする
    7.1 どのような高速化が可能か?
    7.2 JIT対AOTコンパイラ
    7.3 データ型の情報が高速化に役立つわけ
    7.4 Cコンパイラを使う
    7.5 ジュリア集合の例を振り返る
    7.6 Cython
        7.6.1 Python版をCythonでコンパイルする
    7.7 pyximport
        7.7.1 コードブロックを解析するためのCython注釈
        7.7.2 型の注釈を追加する
    7.8 CythonとNumPy
        7.8.1 OpenMPによる並列化
    7.9 Numba
        7.9.1 NumbaでPandas用にNumPyをコンパイルする
    7.10 PyPy
        7.10.1 ガベージコレクションの違い
        7.10.2 PyPyの実行とモジュールのインストール
    7.11 スピード改善のまとめ
    7.12 各技術をいつ使うのか?
        7.12.1 他のプロジェクト
        7.12.2 GPUについて
        7.12.3 PyTorchの動的グラフ
        7.12.4 GPUプロファイリングの基礎
        7.12.5 GPUの性能に関して考慮すべきこと
        7.12.6 GPUを使うべきとき
    7.13 外部関数インタフェース
        7.13.1 ctypes
        7.13.2 cffi
        7.13.3 f2py
        7.13.4 CPythonモジュール
    7.14 まとめ

8章 非同期I/O
    8.1 非同期プログラミング入門
    8.2 async/awaitの仕組み
        8.2.1 逐次処理によるクローラー
        8.2.2 gevent
        8.2.3 Tornado
        8.2.4 aiohttp
    8.3 共有CPUとI/Oワークロード
        8.3.1 逐次処理
        8.3.2 バッチ処理の結果
        8.3.3 非同期処理
    8.4 まとめ

9章 multiprocessingモジュール
    9.1 multiprocessingモジュールの概要
    9.2 モンテカルロ法を使ってπを推定する
    9.3 プロセスとスレッドを用いてπを推定する
        9.3.1 Pythonオブジェクトを使用する
        9.3.2 multiprocessingをJoblibに置き換える
        9.3.3 並列処理における乱数
        9.3.4 NumPyを使う
    9.4 素数を求める
        9.4.1 処理のキュー
    9.5 プロセス間通信を用いて素数を判定する
        9.5.1 逐次処理法
        9.5.2 単純Pool法
        9.5.3 改良版単純Pool法
        9.5.4 Manager.Valueをフラグとして用いる
        9.5.5 Redisをフラグとして用いる
        9.5.6 RawValueをフラグとして用いる
        9.5.7 mmapをフラグとして用いる
        9.5.8 mmapフラグを改良する
    9.6 multiprocessingを用いてNumPyのデータを共有する
    9.7 ファイルと変数のアクセスを同期させる
        9.7.1 ファイルのロック
        9.7.2 値をロックする
    9.8 まとめ

10章 クラスタとジョブキュー
    10.1 クラスタの利点
    10.2 クラスタの欠点
        10.2.1 ウォールストリートが被った4億6,200万ドルの損失
        10.2.2 全世界でSkypeが24時間停止した件
    10.3 一般的なクラスタ設計
    10.4 クラスタ化の着手法
    10.5 クラスタを用いるときの苦痛を避ける方法
    10.6 2種のクラスタ
        10.6.1 研究を支援するのにIPython Parallelを用いる
        10.6.2 Daskを用いてPandasの並列化
    10.7 堅牢な実用クラスタのためにNSQを用いる
        10.7.1 キュー
        10.7.2 pub/sub
    10.8 他のクラスタ化ツール
    10.9 Docker
        10.9.1 Dockerの性能
        10.9.2 Dockerのメリット
    10.10 まとめ

11章 RAM使用量を削減する
    11.1 基本データ型のオブジェクトはコストが高い
        11.1.1 arrayモジュールを使って基本データ型を効率的に格納する
        11.1.2 NumExprを使ってNumPyのRAM使用量を削減する
    11.2 コレクションに使われるRAMを理解する
    11.3 バイトとUnicodeの違い
    11.4 RAMに大量のテキストを効率よく格納する
        11.4.1 1,100万個のトークンを扱う
    11.5 scikit-learnのFeatureHasherを使って大量のテキストをモデリングする
    11.6 DictVectorizerとFeatureHasherの使い方
        11.6.1 DictVectorizerとFeatureHasherを実際の問題で比較する
    11.7 SciPyのスパース行列
    11.8 RAM使用量を減らすための工夫
    11.9 確率的なデータ構造
        11.9.1 1バイトMorrisカウンタによる超近似計数法
        11.9.2 K-最小値(KMV)
        11.9.3 Bloomフィルタ
        11.9.4 LogLogカウンタ
        11.9.5 各種方法の比較

12章 現場に学ぶ
    12.1 Feature-engineによる特徴エンジニアリングパイプラインの合理化
        12.1.1 機械学習の特徴エンジニアリング
        12.1.2 特徴エンジニアリングパイプラインをデプロイする難しさ
        12.1.3 オープンソースのPythonライブラリの活用
        12.1.4 Feature-engineを用いたパイプラインの構築とデプロイの円滑化
        12.1.5 新しいオープンソースパッケージの導入支援
        12.1.6 オープンソースライブラリの開発、メンテナンス、貢献の促進
    12.2 高パフォーマンスのデータサイエンスチーム
        12.2.1 どのくらい時間がかかりますか?
        12.2.2 ディスカバリー&プランニング
        12.2.3 期待値と納期を管理する
    12.3 Numba
        12.3.1 簡単な例
        12.3.2 ベストプラクティスと推奨事項
        12.3.3 情報の入手
    12.4 最適化 vs. 思考
    12.5 Adaptive Labのソーシャルメディア分析(2014)
        12.5.1 Adaptive LabにおけるPython
        12.5.2 ソーシャルメディア分析の設計
        12.5.3 開発方法
        12.5.4 SoMAの保守
        12.5.5 仲間へのアドバイス
    12.6 RadimRehurek.comにおける深層学習の高速化(2014)
        12.6.1 スイートスポット
        12.6.2 最適化の教訓
        12.6.3 まとめ
    12.7 Lyst.comにおける大規模な実用機械学習(2014)
        12.7.1 クラスタ設計
        12.7.2 動きの速いスタートアップにおけるコード評価
        12.7.3 レコメンドエンジンを開発する
        12.7.4 レポートと監視
        12.7.5 アドバイスをいくつか
    12.8 Smesh社における大規模ソーシャルメディア分析(2014)
        12.8.1 Smesh社におけるPythonの役割
        12.8.2 基盤
        12.8.3 高性能なリアルタイム文字列マッチ
        12.8.4 レポート、監視、デバッグ、デプロイ
    12.9 PyPyを用いたWebとデータ処理システムの成功例(2014)
        12.9.1 前提条件
        12.9.2 データベース
        12.9.3 Webアプリケーション
        12.9.4 OCRと翻訳
        12.9.5 タスク分散とワーカー
        12.9.6 まとめ
    12.10 Lanyrd.comにおけるタスクキュー(2014)
        12.10.1 LanyrdにおけるPythonの役割
        12.10.2 タスクキューの性能を向上する
        12.10.3 レポート、監視、デバッグ、デプロイ
        12.10.4 仲間へのアドバイス

付録A サンプルプログラムについて

索引

コラム目次
   1章を読めば以下の問いに答えられるようになる
   2章を読めば以下の問いに答えられるようになる
   3章を読めば以下の問いに答えられるようになる
   演習3-1
   演習3-2
   4章を読めば以下の問いに答えられるようになる
   演習4-1
   演習4-2
   5章を読めば以下の問いに答えられるようになる
   6章を読めば以下の問いに答えられるようになる
   7章を読めば以下の問いに答えられるようになる
   8章を読めば以下の問いに答えられるようになる
   9章を読めば以下の問いに答えられるようになる
   10章を読めば以下の問いに答えられるようになる
   11章を読めば以下の問いに答えられるようになる
   12章を読めば以下の問いに答えられるようになる