Saturday, October 28, 2006
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"] とかやると,うまくキーの一覧を取れないし.
ハッシュはなるべく使わずリストでやるべし,ということなのかもしれないけど・・・ううむ.
情報処理試験
ネットワーク受けてきました.
今回は過去最高に勉強したきがする.といっても買った本を2/3くらい読んだだけだけど(^^;
そのおかげか午前はたぶん大丈夫.午後1もきっと大丈夫.
でも午後2があまり出来なかった感じ.受かってるといいけどなぁ.
Tuesday, October 10, 2006
jQuery 1.0.2 リリース
1.0.2がリリースされたようです.
まだ中身は追ってないですが・・・後日かなぁ.
詳細はMLのリリース投稿をどうぞ.
色々拡張&バグFIXされているようです.
追記:
ブログのリリース記事もでたようです.
こちらには変更点のサマリーがあります.
Recent Comments