【感想】Cython - Cとの融合によるPythonの高速化 -

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

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

感想

ブログを始めて第一回目の感想です。 Pythonを本格的に学ばねばと思ったので、Python本を買い漁ったのですがそのうちの一冊です。 pandasやscikits-learnでも使われているPythonを高速化するツール?Cythonに関する本です。

Cythonについて学んだこと

用途

Cythonには主に以下の用途がありその説明が主です。

Cython利用の流れ

基本的にCythonのコードはPythonのコードをそのまま使うことが出きるんですが、 静的な型の指定など高速化のために拡張されたシンタックスが提供されています。 そのためPythonコードを任意のレベルでC流に書き換えることができます。

Cythonコードを実際に利用する流れとしては以下の通りです。

  • .pyxという拡張子を持つファイルにCythonコードを保存(分割コンパイルの場合はヘッダーファイル的な役割をする.pxdファイルも用意します)
  • それをCに変換、コンパイルし共有ライブラリ(.soファイル)を生成
  • 共有ライブラリをpythonからモジュールとして読み込める場所に配置し、読み込んでCythonコード内に定義した関数を利用

とことんCレベルで高速な処理を行いたい場合はPython/C APIの関数(PyObject_Callとか)が、CythonコードをCに変換した後のコードに出ないように、 定義している全ての変数に対して静的な型を指定することが大事のようです。 (ただボトルネックでないところまでCythonで書くのは労力的によろしくないようです。)

色々できる

Cythonはnumpyと共存できたり、Cレベルでの拡張クラスを実装できたり、C++STLもラップできたり、Cレベルで書いたコードから呼び出されるコールバック関数に通常のPython関数を指定できたりと、かゆいところに手が届く汎用性があるようです。

あと、この本で始めて知ったんですがPythonはGIL(Global Interpreter Lock)というものを持っているらしく、 マルチスレッドにしても、ある一時において実行できるPythonコードはGILにより一つに限られてしまい、スレッドによる並列化の意味があまりないんですね。。 これを乗り越えるためにCythonではGILの制限を外してCレベルでマルチスレッドを扱えるようで、 その例としてOpenMPを使った例が示されていました。 (OpenMPってC/C++のマルチスレッドプログラミングの中で今主流なんですかね。C/C++とかだとpthreadでのプログラミングしかしたことないんですが。。)

個人的に思うこと

いろいろとかゆい所に手が届くCythonですが、 Pythonライブラリを作りたい人、もしくはPythonライブラリをコードリーディングしたい人向けのような気がします。

PythonによるWebサービスとかに使うにはすこし運用しづらいと思います。 コードを変更する度に本番のwebサーバと同じ環境のサーバ上でコンパイルして共有ライブラリを作って本番にデプロイしてモジュールを再読み込みさせたりとか考えたくないです。 (Webサービスの場合はおそらくCythonを使うよりもPyPyを使った方がいい気がするので、Webサービスだけの用途でPythonを使っている場合はPythonに関する教養を身につけるくらいのスタンスでこの本を読んだ方がいいかもしれません。もしくわこの辺のうまい運用の仕方などが書かれているとうれしかったです。)

なので、Webサービス以外の例えば機械学習やデータ分析系のライブラリを出したい、もしくわそういったライブラリにプルリクを投げたいみたいな人は この本はとても価値がある思います(どちらかといえば私は機械学習やデータ分析に興味があるのでこの本を読んでよかったと思います)。

2016/01/02現在 個人的に読んでいる/読みたい技術本一覧

はじめに

ここでは現在読んでいる/読みたい本を一覧で紹介します。 (ついでになんで読みたいかも簡単に書きます)

読んでいる最中

大体2、3冊を並行で読んでいます。

ハイパフォーマンスPython

ハイパフォーマンスPython

  • Pythonはいままで軽く触った程度だったんですが、自分が思うに機械学習の分野は現在C/C++PythonまたはJavaScalaができないとやっていけないなと強く感じています*1。なので最近はPython系の本を読み漁っています。

C++のエッセンス

C++のエッセンス

  • C++の本(Effective Modern C++)を読もうとしたらつまずいたのでとりあえず基礎から。Cライクな実装を今までしてきましたが(辛うじてSTLを利用するレベル)、EffectiveなんちゃらC++系の本を読むためにはC++独自の実装方法を知る必要があるようです。

CUDA C プロフェッショナル プログラミング (impress top gear)

CUDA C プロフェッショナル プログラミング (impress top gear)

  • いい加減GPUやらないと。。GPUアーキテクチャがどんどん進化していって、昔書いた低レベルに最適化されたコードが、次世代のアーキテクチャだと通用しない場合があるようですね(ハイパフォーマンスPythonの著者談)。CUDAのような高レベルのライブラリを積極的に使ったほうがいいとのこと。

途中まで読んで一旦ペンディング中の本

これらの本は読みたいんですけど先に優先して読みたい本があり、一旦ペンディングしている本です。

Effective C++ 第3版 (ADDISON-WESLEY PROFESSIONAL COMPUTI)

Effective C++ 第3版 (ADDISON-WESLEY PROFESSIONAL COMPUTI)

  • Effective Modern C++を読むための通り道。

C++のためのAPIデザイン

C++のためのAPIデザイン

  • 再利用や拡張性の高いC++コードを書きたいので読んでいます。

ウォール街のアルゴリズム戦争

ウォール街のアルゴリズム戦争

  • タイトルにひかれて購入したのですが、最初は前提知識がないと理解できない文が多く難儀していたのですが、後々読んでいくとそれらの説明が書かれていておもしろくなってきます。アメリカの市場において人手によるマーケットメーカから計算機によるマーケットメーカへの変化の過程(イノベーション)がドキュメンタリーとしてかかれており、また、その過程で出てくる技術系の話もおもしろいです(サーバのコロケーションとか電子的な注文がどういう流れで約定されるのかなど)。あともうちょっとで読み終えるのですが、少しペンディング中。

買ったけど積んでいる読みたい本

  • 取り上げている全ての内容に興味があるわけではないですが、Cでのビルド(特にCMakeに興味あり)についてと線型代数操作のライブラリ(Blas)の話が書かれているようで、 これ系の話題を取り上げている本をあまりみかけないので購入しました(まだ読んでませんが。。)。

Effective Modern C++ ―C++11/14プログラムを進化させる42項目

Effective Modern C++ ―C++11/14プログラムを進化させる42項目

  • 買ったはいいんですが、CライクなC++を書いてきた私には内容が難しすぎて積んでいます。。とりあえず、C++のエッセンスとEffective C++、Effective More C++を読んでからですかね。。

新訂版MORE EFFECTIVE C++ (ADDISONーWESLEY PROFESSIONAL CO)

新訂版MORE EFFECTIVE C++ (ADDISONーWESLEY PROFESSIONAL CO)

  • 同じくEffective Modern C++を読むための通り道。

実践 コンピュータビジョン

実践 コンピュータビジョン

入門 自然言語処理

入門 自然言語処理

  • 勉強中のPythonを使っている機械学習・データ分析系の本をざっと購入。

Deep Belief Nets in C++ and Cuda C: Restricted Boltzmann Machines and Supervised Feedforward Networks

Deep Belief Nets in C++ and Cuda C: Restricted Boltzmann Machines and Supervised Feedforward Networks

Deep Belief Nets in C++ and CUDA C: Autoencoding in the Complex Domain

Deep Belief Nets in C++ and CUDA C: Autoencoding in the Complex Domain

  • Deep learningの実装が説明されている本。CUDA Cの本を読み終えたら読みたい本。

関数型オブジェクト指向AI プログラミング―Scala による人工知能の実装

関数型オブジェクト指向AI プログラミング―Scala による人工知能の実装

  • 後半にディープラーニング(デノイジングオートエンコーダやディープニューラルネットワークなど)のScala実装があり購入。(ニッチだと思うんですが)Scalaで書かれているのがすばらしいと思います。

深層学習: Deep Learning

深層学習: Deep Learning

進化計算と深層学習 -創発する知能―

進化計算と深層学習 -創発する知能―

  • Deep learningの本の中でも進化計算との共存について触れられている本はこれくらいだと思います。ざっと見ですが、本当に深く理解するためには論文まで追っかける必要がありそうな気がします。Deep learningと進化計算の組み合わせでどういった研究がされているのか大まかに知るには適していると思います。

フラッシュ・ボーイズ 10億分の1秒の男たち

フラッシュ・ボーイズ 10億分の1秒の男たち

Speech Recognition Algorithms Based on Weighted Finite-State Transducers (Synthesis Lectures on Speech and Audio Processing)

Speech Recognition Algorithms Based on Weighted Finite-State Transducers (Synthesis Lectures on Speech and Audio Processing)

  • 探索を使う機械学習を研究していた身としてはWFSTをずっと気にしていたのですがなかなか機会がありませんでした。WFSTの応用例として音声認識の探索問題があるのですが、それを解説した本が出たので購入しました。実はこの本、私が博士一年のときにAmazonで存在を知って予約をしたことがあるのですが、まだその時点ではこの著者がこの本を書くことを知らなかったようです*2。それから4年の月日が流れ、この本をやっと読むことができるというのは少し感慨深いものがあります。

*1:機械学習分野でJava/Scalaが必要になるのはSparkによるものです。SparkはPythonでも使うことはできますが、Spark用機械学習ライブラリmllibを拡張しようと思うとScalaが必要になります。またSparkを使ったDeep learningの実装としてDL4Jがあるのですが、これがJavaScalaで書かれています。なので分散環境での機械学習にはJavaScalaがメインになり、一台のマシンで完結できる場合はC/C++Pythonかなと。TensorFlowなどC/C++Pythonで分散環境に対応した機械学習ツールが扱いやすくなってくると必ずしもそうなるとは限りませんが。

*2:何を言っているのかわからないと思うのですが、著者はWFSTの本について当時そういった依頼があると軽く知っていた程度だったようです。にもかかわらず、すでにAmazonで予約できるという状況になっていたんです。これには著者も驚いていたようです。Amazon恐るべし。

ブログ開設について

はじめに

あけましておめでとうございます!!

エンジニアのarumihoiru89と申します。

新年になり新しいことでも始めようと思いブログを開設しました。 動機ですが、このブログは技術系の本の感想をアウトプットしていくことがメインになるのですが、 これにより自分の本を読むモチベーションの向上と自分の読書速度の測定を行いたいと思っています。

書いてく内容

主に技術系の本の感想がメインとなると思いますが、感想以外の技術系の話も書いていこうと思っています。 技術系の本と書きましたが具体的には以下の興味のある分野に偏ると思います。

書いてくペース

私の読書のペースにもよると思いますが最低でも一ヶ月に一回は投稿しようと思っています。

最後に

文章を書くのは苦手で拙い文章になると思いますが皆様のでかい器で見ていただけると幸です。