日記帳だ! with Tux on Libserver

二度目の大改造!! 日記帳…か?を継承し、より柔軟でパワフルなBlogに変身しました。

RSSに対応しています。リンク・コメント・トラックバックは自由にしていただいてほぼ問題ありません。
RSS購読方法、僕のリンク・コメント・トラックバックについての考えを読むことをおすすめします。

Cythonを使うほどのことはある?

今日はB4向けのScilab講習があったんだけど、

その例題の中に、Scilabのforと行列演算の比較があった。

ちょうど1年前ぐらいに話題にしたが、Scilabというのはいまどき純粋なインタプリタらしく、

ループさせると構文解析まで繰り返すためか途端に遅くなる。

Scilabでは速いとされる

それゆえに非効率に思えても無理やり行列演算で書いた方が早いという特徴を持っている。

というかScilabはともかく、売り物であるところのMATLABも似たようなものらしいし、それはいかんよなぁ。


PythonやRubyではあらかじめコンパイルするから、forで極端に遅くなるようなことないはず。

という話をしていたら、PythonをCに変換することでさらなる高速化を実現する方法があるとのこと。

うーん、確かに高速化できるだろうけど、そこまでして高速化するメリットってなによ。

そんな疑問はあったものの、調べてみたら、どうもCythonというもののことを言っていたようだ。


Cythonの概略を言えば、PythonのコードをCに変換してネイティブコードを作るものだが、

厳密にはCythonというのはPythonとは異なる言語らしいのだが、Pythonのコードはそのまま使えるようだ。

Cythonを使うことで高速化するためのポイントは型指定を行うことらしい。

動的な言語では変数の型が動かしてみるまでわからないので、ここにオーバーヘッドがかかってしまう。

けどこれはlong型とかわかってれば、それで高速なコードが生成できると、それがCythonを使うメリットらしい。

なるほどなぁ。


しかし、どこでCythonを使うかというのは1つ問題である。

基本的にはPythonのモジュールを作るために使われるものなのかなと思うんだけどね。

Cに変換して、それをコンパイルというのは、それなりに時間のかかる処理だろうから、一回切りのプログラムでそれはもったいない。

最初のコンパイルはあっさり、けど動作はそこまで速くないというのがLLだと思うんだよね。

Cと同じぐらい早いよと言われても、そのために最初にかかる時間が増えてはどうしょうもないという意見もあるだろう。

それでも計算時間が気になる場合には有効な方法と思うので、気になる人は調べて使ってみればいいと思う。


ところで、PythonやRubyではforで極端に遅くなることはないと書いたが、実際にRubyで試してみた。

s=0;
for i in 1..10000000
  s+=i
end

s=(1..10000000).inject(:+)

上と下で10回実行して所要時間を比較してみた。

すると上の平均が4.21[s]、下の平均が2.94[s]、まぁこんなもんならforで極端に遅くなっているということはなさそうね。

この2つで大きな差が出る環境はやっぱりおかしいんだ、とそういうことを改めて記して終わる。


Author : Hidemaro
Date : 2014/05/07(Wed) 23:35
コンピュータ・インターネット | Comment | trackback (0)

Tools