M. Gorelick; I. Ozsvald『ハイパフォーマンスPython』オライリー・ジャパン(2015年)
Pythonの高速化技法について一歩踏み込んだプロユースの解説書。ボトルネックの測定方法から、最適なデータ構造の使い分け、CythonやPyPyなどのコンパイラの比較、numpyなどのパッケージの使い方、マルチコアCPUの活用法、メモリ効率を劇的に改善するトライ構造や近似計算まで、シンプルな実例プログラムを用いながらわかりやすく説明します。高性能なプログラムの書き方だけでなく、高性能なシステムの作り方を総合的に学ぶことができるPythonエキスパート必携の一冊です。ハイパフォーマンスPython [ ミヒャ・ゴアリク ]価格:3888円(税込、送料無料) (2017/4/22時点) 発売日:2015年11月 著者/編集:ミヒャ・ゴアリク, イアン・オズワルド 発行元:オライリー・ジャパン発売元:オーム社ページ数:335p ISBNコード:9784873117409原書: High Performance Python訳者まえがきまえがき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 Cython7.6.1 Python版をCythonでコンパイルする7.6.2 コードブロックを解析するためのCython注釈7.6.3 型の注釈を追加する7.7 Shed Skin7.7.1 拡張モジュールを作る7.7.2 メモリコピーのコスト7.8 Cythonとnumpy7.8.1 1つのマシン上でのOpenMPを使った並列化法7.9 Numba7.10 Pythran7.11 PyPy7.11.1 ガベージコレクションの違い7.11.2 PyPyを実行しモジュールをインストールする7.12 各技術をいつ使うのか?7.12.1 他のプロジェクト7.12.2 GPUについて7.12.3 未来のコンパイラプロジェクトに望むこと7.13 外部関数インタフェース7.13.1 ctypes7.13.2 cffi7.13.3 f2py7.13.4 CPythonモジュール7.14 まとめ8章 並行処理8.1 非同期プログラミング入門8.2 逐次処理によるクローラー8.3 gevent8.4 tornado8.5 AsyncIO8.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におけるPython12.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 サンプルプログラムの実行楽天ブックスは品揃え200万点以上!