内容紹介
Pythonの「遅さ」を解消するCythonの解説書!
豊富なライブラリで科学計算から金融工学まで利用が広がるPythonですが、速度が遅いという弱点を抱えています。この「遅さ」を解消すべく登場したのがCythonです。本書はPythonの表現性とC/C++の速さを備えたCythonを使って、パフォーマンス向上を図るための手法を示します。科学技術計算や統計分析の分野では恒常的にある「Pythonの速度を向上させたい」というニーズに応える一冊。
このような方におすすめ
科学計算、データ分析、金融工学にPythonを使うプログラマ、Python中上級者、研究者
目次
詳細目次
はじめに
1章 Cythonの基本
1.1 Python、C、Cythonの比較
1.1.1 関数呼び出しのオーバーヘッド
1.1.2 ループ処理
1.1.3 算術演算
1.1.4 スタックとヒープ
1.2 頭を冷やそう
1.3 CythonによるCコードのラップ
1.4 まとめ
2章 Cythonコードのコンパイルと実行
2.1 Cythonのコンパイルパイプライン
2.1.1 コンパイラのインストールとセットアップのテスト
2.2 標準的な方法:distutilsとcythonizeを使う方法
2.2.1 使用するdistutilsスクリプト
2.2.2 Mac OS X、Linuxでのdistutilsを使うコンパイル
2.2.3 Windowsでのdistutilsを使うコンパイル
2.2.4 拡張モジュールの使い方
2.3 IPythonの%%cythonを使う対話的Cython
2.4 pyximportによるその場でのコンパイル
2.4.1 pyximportの制御と依存関係の管理
2.4.2 外部依存コードがあるときのpyximportの例
2.5 手作業でのコンパイル
2.6 Cythonとほかのビルドシステムの組み合わせ
2.6.1 CMakeとCython
2.6.2 SConsとCython
2.6.3 MakeとCython
2.7 コンパイラディレクティブ
2.8 まとめ
3章 Cythonの深層
3.1 インタープリタによる実行とコンパイラによる実行
3.2 動的な型付けと静的な型付け
3.3 cdefによる静的型宣言
3.3.1 Cythonにおける自動型推論
3.3.2 CythonにおけるCポインタ
3.3.3 静的に型付けされた変数と動的に型付けされた変数の併用
3.3.4 Python型の静的な宣言
3.3.5 スピードを得るための静的型付け
3.3.6 参照カウント管理と静的文字列型
3.4 Cythonの3種類の関数
3.4.1 defキーワードによるCython内のPython関数
3.4.2 cdefキーワードによるCython内のC関数
3.4.3 cpdefによるdef関数とcdef関数の融合
3.4.4 関数と例外処理
3.4.5 関数とembedsignatureコンパイラディレクティブ
3.5 強制型変換とキャスト
3.6 構造体、共用体、列挙型の宣言
3.7 ctypedefによる型エイリアス
3.8 Cythonのforループとwhileループ
3.8.1 効率のよいループを生成するためのガイドライン
3.8.2 ループの例
3.9 Cythonプリプロセッサ
3.10 Python 2とPython 3間の橋渡し
3.10.1 str、unicode、bytesについて
3.11 まとめ
4章 Cythonの実際:多体問題シミュレーション
4.1 Pythonによる多体問題コードの概要
4.2 Cythonへの変換
4.2.1 Pythonでのデータ構造と構成
4.2.2 Pythonデータ構造からC構造体への変換
4.2.3 Cython化バージョンの実行
4.3 まとめ
5章 Cythonと拡張型
5.1 Pythonのクラスと拡張型の比較
5.2 Cythonの拡張型
5.3 型の属性とアクセス制御
5.4 Cレベルの初期化とクリーンアップ
5.5 cdefメソッドとcpdefメソッド
5.6 継承とサブクラス化
5.6.1 キャストとサブクラス
5.6.2 拡張型のオブジェクトとNone
5.7 Cythonにおける拡張型プロパティ
5.8 特殊メソッドはさらに特殊
5.8.1 算術演算メソッド
5.8.2 リッチ比較
5.8.3 イテレータのサポート
5.9 まとめ
6章 Cythonコードの構成
6.1 Cythonの実装(.pyx)、宣言(.pxd)ファイル
6.2 cimport文
6.2.1 定義済みの定義ファイル
6.3 インクルードファイルとinclude文
6.4 Pythonパッケージ内のCythonモジュールの構成とコンパイル
6.5 まとめ
7章 CythonによるCライブラリのラップ
7.1 Cythonにおける外部Cコードの宣言
7.1.1 Cythonはラップを自動化しない
7.2 外部C関数とtypedefの宣言
7.3 Cの構造体、共用体、列挙型の宣言とラップ
7.4 C関数のラップ
7.5 拡張型を使ったC構造体のラップ
7.6 const、その他の修飾子、Cythonが生成するコードの制御
7.7 エラーチェックと例外の生成
7.8 コールバック
7.8.1 コールバックと例外の伝播
7.9 まとめ
8章 CythonによるC++ライブラリのラップ
8.1 単純な例:MT_RNGクラス
8.1.1 ラッパー拡張型
8.1.2 C++によるコンパイル
8.1.3 Pythonからのラッパーの使い方
8.1.4 多重定義されたメソッドと関数
8.1.5 多重定義された演算子
8.2 C++例外
8.3 C++インスタンスのスタックおよびヒープ上のメモリ割り当て
8.4 C++クラス階層の取り扱い
8.5 C++テンプレート
8.5.1 テンプレート関数とCythonの融合型
8.5.2 テンプレートクラス
8.5.3 イテレータと入れ子クラス
8.5.4 インクルードされたSTLコンテナクラスの宣言
8.6 メモリ管理とスマートポインタ
8.7 まとめ
9章 Cythonのプロファイリングツール
9.1 Cythonの実行時間のプロファイリング
9.2 プロファイリングとアノテーション
9.3 まとめ
10章 Cython、NumPy、型付きメモリビュー
10.1 新しいバッファプロトコルの威力
10.1.1 memoryview型
10.2 型付きメモリビュー
10.2.1 型付きメモリビューの例
10.2.2 型付きメモリビューデータに対するCレベルのアクセス
10.2.3 安全性を犠牲にした性能の向上
10.2.4 型付きメモリビューの宣言
10.2.5 型付きメモリビューの使い方
10.2.6 バッファを越えて
10.3 C、C++配列のラップ
10.3.1 CythonとC配列の正しい(そして自動的な)メモリ管理
10.4 まとめ
11章 Cythonの実際:スペクトルノルム
11.1 Pythonによるスペクトルノルム計算コードの概要
11.2 性能のプロファイリング
11.3 コードのCython化
11.3.1 静的型情報の追加
11.3.2 型付きメモリビューの利用
11.4 Cによる実装との比較
11.5 まとめ
12章 Cythonと並列プログラミング
12.1 スレッドベース並列処理とグローバルインタープリタロック
12.1.1 関数のnogil属性
12.1.2 with nogilコンテキストマネージャ
12.2 prangeを使ったループの並列処理
12.2.1 prangeの使い方
12.2.2 prangeのオプション
12.3 prangeを使ったリダクション
12.4 並列プログラミングの指針と落とし穴
12.5 まとめ
13章 世界の中のCython
13.1 Cythonとほかのプロジェクト
13.1.1 その他のPython事前コンパイラ
13.1.2 Pythonラッパープロジェクト
13.1.3 Python用実行時コンパイラ
13.2 まとめ
索引
続きを見る