ハイパフォーマンスPython

[cover photo]
TOPICS
Programming , Python
発行年月日
PRINT LENGTH
360
ISBN
978-4-87311-740-9
原書
High Performance Python
FORMAT
PDF EPUB
Print
3,960円
この商品は品切れ再入荷未定です

Pythonの高速化技法について一歩踏み込んだプロユースの解説書。ボトルネックの測定方法から、最適なデータ構造の使い分け、CythonやPyPyなどのコンパイラの比較、numpyなどのパッケージの使い方、マルチコアCPUの活用法、メモリ効率を劇的に改善するトライ構造や近似計算まで、シンプルな実例プログラムを用いながらわかりやすく説明します。高性能なプログラムの書き方だけでなく、高性能なシステムの作り方を総合的に学ぶことができる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 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 サンプルプログラムの実行

索引