Cython

―Cとの融合によるPythonの高速化

[cover photo]
TOPICS
Programming , C/C++ , Python
発行年月日
PRINT LENGTH
268
ISBN
978-4-87311-727-0
原書
Cython
FORMAT
Print PDF
Ebook
3,520円
Ebookを購入する
Print
3,520円

強力なライブラリを豊富に備え、科学計算から統計分析、金融工学まで利用が広がるPython。スクリプト言語とは思えない高速性の秘密が、NumPyやSciPyなどのPythonパッケージで広く使われているCythonです。CythonはPythonプログラムの実装を高速化するコンパイラであると同時に、C/C++で書かれたライブラリをPythonから利用できるようにするブリッジとしての役割も果たします。本書はPythonの表現力とC/C++の速さを備えたCythonを使って、高速なシステムを効率的に開発する手法を示します。科学技術計算や統計分析の分野では恒常的にある「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 まとめ

索引