Pythonの高速化技法について一歩踏み込んだプロユースの解説書。ボトルネックの測定方法から、最適なデータ構造の使い分け、CythonやPyPyなどのコンパイラの比較、numpyなどのパッケージの使い方、マルチコアCPUの活用法、メモリ効率を劇的に改善するトライ構造や近似計算まで、シンプルな実例プログラムを用いながらわかりやすく説明します。高性能なプログラムの書き方だけでなく、高性能なシステムの作り方を総合的に学ぶことができるPythonエキスパート必携の一冊です。
翻訳者の相川氏のブログには、本書の追加情報や関連する技術情報が掲載されています。
ハイパフォーマンスPython
Micha Gorelick、Ian Ozsvald 著、相川 愛三 訳
- TOPICS
- Programming , Python
- 発行年月日
- 2015年11月
- PRINT LENGTH
- 360
- ISBN
- 978-4-87311-740-9
- 原書
- High Performance Python
- FORMAT
- PDF EPUB
関連ファイル
目次
訳者まえがき まえがき 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 サンプルプログラムの実行 索引