内容紹介
Pythonで大規模なデータ処理をするときに不可欠なポイントを網羅!
Pythonの高速化技法について一歩踏み込んだプロユースの解説書。ボトルネックの測定方法から、最適なデータ構造の使い分け、CythonやPyPyなどのコンパイラの比較、numpyなどのパッケージの使い方、マルチコアCPUの活用法、メモリ効率を劇的に改善するトライ構造や近似計算まで、シンプルな実例プログラムを用いながらわかりやすく説明します。高性能なプログラムの書き方だけでなく、高性能なシステムの作り方を総合的に学ぶことができるPythonエキスパート必携の一冊です。
このような方におすすめ
中級以上のPythonプログラマー、プログラミング経験者、Web開発者、サイエンティスト、アナリスト、教職員、大学生、ハッカー
目次
詳細目次
訳者まえがき
まえがき
1章 高性能なPythonを理解する
1.1 コンピュータシステムの基礎
1.1.1 演算装置
1.1.2 記憶装置
1.1.3 接続レイヤ
1.2 基本要素を統合する
1.2.1 理想計算とPython仮想マシン
1.3 それでもPythonを使う理由
2章 ボトルネック発見のためのプロファイリング
2.1 効率のよいプロファイリング
2.2 ジュリア集合について
2.3 ジュリア集合全体を計算する
2.4 時間計測の簡単な方法 ―― printとデコレータ
2.5 Unixのtimeコマンドを用いて簡単に時間測定する
2.6 cPro.leモジュールを使う
2.7 RunSnakeRunを使ってcPro.le出力を視覚化する
2.8 line_pro.lerを使って行単位で計測する
2.9 memory_pro.lerを使ってメモリ使用を診断する
2.10 heapyを使ってヒープ上のオブジェクトを調査する
2.11 dowserを使って実体化された変数のリアルタイムグラフを描く
2.12 disモジュールを使ってCPythonのバイトコードを調べる
2.12.1 方法が変われば複雑度も変わる
2.13 最適化中に単体テストをして正確さを維持する
2.13.1 何もしない@pro.leデコレータ
2.14 成功するプロファイリング戦略
2.15 まとめ
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 まとめ
7章 Cにコンパイルする
7.1 どんな高速化が可能か?
7.2 JIT対AOTコンパイラ
7.3 データ型の情報が高速化に役立つわけ
7.4 Cコンパイラを使う
7.5 ジュリア集合の例を振り返る
7.6 Cython
7.6.1 Python版をCythonでコンパイルする
7.6.2 コードブロックを解析するためのCython注釈
7.6.3 型の注釈を追加する
7.7 Shed Skin
7.7.1 拡張モジュールを作る
7.7.2 メモリコピーのコスト
7.8 Cythonとnumpy
7.8.1 1つのマシン上でのOpenMPを使った並列化法
7.9 Numba
7.10 Pythran
7.11 PyPy
7.11.1 ガベージコレクションの違い
7.11.2 PyPyを実行しモジュールをインストールする
7.12 各技術をいつ使うのか?
7.12.1 他のプロジェクト
7.12.2 GPUについて
7.12.3 未来のコンパイラプロジェクトに望むこと
7.13 外部関数インタフェース
7.13.1 ctypes
7.13.2 cffi
7.13.3 f2py
7.13.4 CPythonモジュール
7.14 まとめ
8章 並行処理
8.1 非同期プログラミング入門
8.2 逐次処理によるクローラー
8.3 gevent
8.4 tornado
8.5 AsyncIO
8.6 データベースの例
8.7 まとめ
8.8 サーバー
9章 multiprocessingモジュール
9.1 multiprocessingモジュールの概要
9.2 モンテカルロ法を使ってπを推定する
9.3 プロセスとスレッドを用いてπを推定する
9.3.1 Pythonオブジェクトを使用する
9.3.2 並列処理における乱数
9.3.3 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 3種のクラスタ
10.6.1 単純なローカルクラスタでParallel Pythonモジュールを使う
10.6.2 研究を支援するのにIPython Parallelを用いる
10.6.3 堅牢な実用クラスタのためにNSQを用いる
10.7 他のクラスタ化ツール
10.8 まとめ
11章 RAM使用量を削減する
11.1 基本データ型のオブジェクトはコストが高い
11.1.1 基本データ型を低コストに記憶するarrayモジュール
11.1.2 numpyを使ってRAMを節約する
11.2 コレクションに使われるRAMを理解する
11.3 バイトとユニコードの違い
11.4 RAMに効率よく大量のテキストを記憶する
11.4.1 8百万個のトークンを扱う
11.5 RAM使用量を削減するコツ
11.6 確率的データ構造
11.6.1 1バイトのMorrisカウンタを用いた近似数え上げ
11.6.2 K-最小値
11.6.3 Bloomフィルタ
11.6.4 LogLogカウンタ
11.6.5 各種方法の比較
12章 現場に学ぶ
12.1 Adaptive Labのソーシャルメディア分析(SoMA)
12.1.1 Adaptive LabにおけるPython
12.1.2 SoMAの設計
12.1.3 開発方法
12.1.4 SoMAの保守
12.1.5 仲間へのアドバイス
12.2 RadimRehurek.comにおける深層学習の高速化
12.2.1 スイートスポット
12.2.2 最適化の教訓
12.2.3 まとめ
12.3 Lyst.comにおける大規模な実用機械学習
12.3.1 LystにおけるPythonの位置づけ
12.3.2 クラスタ設計
12.3.3 動きの速いスタートアップにおけるコード評価
12.3.4 レコメンドエンジンを開発する
12.3.5 レポートと監視
12.3.6 アドバイスをいくつか
12.4 Smesh社における大規模ソーシャルメディア分析
12.4.1 Smesh社におけるPythonの役割
12.4.2 基盤
12.4.3 高性能なリアルタイム文字列マッチ
12.4.4 レポート、監視、デバッグ、デプロイ
12.5 PyPyを用いたWebとデータ処理システムの成功例
12.5.1 前提条件
12.5.2 データベース
12.5.3 Webアプリケーション
12.5.4 OCRと翻訳
12.5.5 タスク分散とワーカー
12.5.6 まとめ
12.6 Lanyrd.comにおけるタスクキュー
12.6.1 LanyrdにおけるPythonの役割
12.6.2 タスクキューの性能を向上する
12.6.3 レポート、監視、デバッグ、デプロイ
12.6.4 仲間へのアドバイス
付録A サンプルプログラムについて
A.1 ソースコードの入手
A.2 サンプルプログラムの実行
索引
続きを見る