« 情報処理試験 | Main | jQuery 1.0.3 »

Sunday, October 15, 2006

Mathematicaプログラミング

Mathematicaのホームユーズライセンスを再びゲットしたので,プログラミングを勉強中...

Mathematicaというと数式処理ソフトみたいなイメージがメインだと思うけど,プログラミング言語も結構力が入っている模様.
以下のリンクを見ると,それが少しわかるかもしれない.

Mathematicaはプログラミング環境としても優れている
プログラミング言語としてのMathematica

普通に手続き型でも書けるし,オブジェクト指向も出来るし,関数型でも書けるし,パターンマッチ(ルール)で処理をさせることもできるし・・・となんでもアリな言語になっていて面白い.
最近のバージョンアップで,Perlとほぼ同レベルの正規表現エンジン(PCREライブラリベースらしい)も搭載したし,DBと接続してSQLやMathematica言語でアクセスしたり,XMLを操ったり,OracleのようにJavaも内蔵したし,.NETとのリンクも出来るし,GUIも出せるし・・・とほんとに何でもアリになってきている.
すでに数式処理システムの範囲ではない気がすごくする(^^;


普段はPerlで前処理をして,結果をMathematicaでちょっぴり加工&可視化しているわけだけど,全部Mathematicaですませることも可能そう.
処理速度的にそっちの方が速いなら,そうしたほうがすっきりするかなぁと.
数値演算系なら,もちろんPerlより断然速いと思うし.

というわけで,多数の10以下のランダムな実数の合計を求めるコードを書いてテストしてみた.

perlでは,こんな感じ.
100万要素で0.4秒くらい.1000万要素にしたらスワップが入ってしまいしばらく待っても終わらなかったので中止.

use strict; use Time::HiRes;

my @data = map { rand(10) } (1..1000000);

my $t0 = [Time::HiRes::gettimeofday];
my $sum = 0;
foreach my $data (@data) {
$sum += $data;
}
print $sum, "\n";

print Time::HiRes::tv_interval($t0), " Second\n";

Mathematicaではこんな感じ.
合計を求める組み込み関数がある時点で対等な評価ではない気もするけれど(^^;

data = Table[Random[Real,10], {1000000}];

Total[data]//AbsoluteTiming

結果が0秒.速すぎる(^^;
1000万要素にして,0.05秒弱.メモリ消費も当然少ない.

ちなみに最大とかも当然一発で出るので,同様のモジュールがPerlにもあれば便利そう.
と思ってCPAN見てたら,普通に List::Util で出来るのね.

my $sum = reduce { $a + $b } @data;

すっきり.
でも実行時間は 0.49秒と遅くなった...(^^;


文字列処理ではどうだろう.
とりあえず正規表現を適当に試してみる.

Perlのコード.

use strict; use Time::HiRes;

my $str = '';
for(my $i = 0; $i <= 500000; $i++) {
$str .= $i;
}

my $t0 = [Time::HiRes::gettimeofday];

$str =~ s/(\d)\1/$1/g;

print Time::HiRes::tv_interval($t0), " Second\n";

Mathematicaのコード.
正規表現の表記は \ のエスケープなどもあって冗長.
Perlのようにスマートには書けない・・・

data=StringJoin[ToString/@Table[n,{n,0,500000}]];

AbsoluteTiming[
StringReplace[data,RegularExpression["(\\d)\\1"]:>"$1"];
]

Perlは2.25秒くらい,Mathematicaは1.45秒くらい.
Mathematicaの方が速い・・・と思いきや,条件によって違う模様.
範囲を~50000までに小さくすると,Mathematicaは0.17秒くらい,Perlは0.08秒くらいでPerlの方がずっと速い.

PCREライブラリを呼び出すオーバーヘッドが大きいのかも.
この例の場合は,Mathematicaのパターンマッチでも対処できるので,それにすると0.10秒くらいでほぼ同一.

AbsoluteTiming[ StringReplace[data, StringExpression[x : DigitCharacter ~~ x_] :> x]; ]

うーん,どっちもどっち?
Mathematicaの場合は正規表現の呼び出しオーバーヘッドを減らすような工夫がいりそうな感じ.
逆に大きいときにMathematicaの方が速いのは何でだろう.
Perlは機能豊富な分,重くなっているのかなぁ?


後気になるのはファイルI/Oと,ハッシュや配列の扱いだろうか・・・
ファイルI/O周りはあまり充実していないような感じだし,Mathematicaにはハッシュに相当するモノが無いので,その辺をどうするかが悩みどころ.

data["key"] = 1; とかは書けるんだけど,多重のハッシュ構造をどうやればいいのかがわからない.

$data{"key1"}{"key2"} = 1 を data["key1"]["key2"] とかやると,うまくキーの一覧を取れないし.
ハッシュはなるべく使わずリストでやるべし,ということなのかもしれないけど・・・ううむ.

|

« 情報処理試験 | Main | jQuery 1.0.3 »

Comments

こんにちは。Mathematicaを初めて使ったのは、UCLAのブックストアでアカデミック版を購入し、Mac SE/30でのことでした。SoftPCが遅すぎて何が何だかわからない環境でも、体感でExcelの10倍ぐらいの速さだったと覚えています。

その後、Power Macでプログラミングも経験しましたが、ピークは数列の代数の計算を瞬時にこなす、やはりスピードでしたね。統計とかはMatlabとかが主だったんですけど、Mathematicaでのデータ処理とかも興味ありますよ。

Posted by: Syokaku | Thursday, July 03, 2008 08:35 AM

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



TrackBack


Listed below are links to weblogs that reference Mathematicaプログラミング:

» perl - Tie::Array::Pack 0.01 Released! [404 Blog Not Found]
これを見ていたたまれなくなったのでこさえました。 みかログ: Mathematicaプログラミング100万要素で0.4秒くらい.1000万要素にしたらスワップが入ってしまいしばらく待っても終わらなかったので中止. Tie::Array::Pack at CPAN (will be available soon) htt...... [Read More]

Tracked on Friday, December 22, 2006 07:04 AM

» perl の配列とメモリー [国民宿舎はらぺこ 大浴場]
朝の頭の体操に。 Mathematicaプログラミング (みかログ さま) perl - Tie::Array::Pack 0.01 Released! (404 Blog Not Found さま) 面白いな、と思ったのは、上記リンク先の話題を手元で試していた [Read More]

Tracked on Friday, December 22, 2006 08:28 AM

« 情報処理試験 | Main | jQuery 1.0.3 »