ブログ遅れちゃいましたが。 今週のはじめにJuliaで書いたPCA hashとITQの実装を公開しました。

https://github.com/beam2d/julia-pcahash

Juliaというのは数値計算・科学計算がメインターゲットの新しい言語です。 つい最近触り始めたんですが、今のところ割りと良好です。 julia-pcahashは勉強用に書きました。

Juliaには以下の様な特徴があります(僕の目にぱっとついたところだけで)。

  • 多次元配列が簡単に扱えて線形代数計算が充実している(MATLABやnumpy/scipyのノリ)
  • 文法はMATLABとRubyとPythonを混ぜたような感じ
  • LLVMベースで、JITが走る
  • 動的型付けで、型アノテーションや多相型があり、型推論による静的最適化が走る
  • 他の科学技術用言語にくらべて数値計算以外の処理が比較的速い
  • Juliaの構文自体をデータ構造として扱えて、マクロが書ける(LISPみたいに1)

Juliaでコード書いてみてわかったことが以下のとおり。

  • ファイルの読み書きは割りと簡単にできる
  • 行列計算はMATLABやnumpy/scipyみたいに書けるが細かい所はいろいろ違う
  • 1-originはやっぱり不便
  • マクロが結構便利に見える
  • BitArrayは2階以上でもびっちり詰まっていて、そこを意識しないと性能劣化する
  • 引数・戻り値が簡単な型(行列含む)なら、Cのコード呼び出し(ccall)はとても簡単
    • 今回、ハミング距離の計算をSSEでやるコードをCで書いて、それを呼び出した2
  • 標準ライブラリはまだ痒いところにちょっと手が届かないレベル
  • パッケージは盛んに開発されている雰囲気
  • 起動が重い

速度もそこそこ速いように思います。 そのうちちゃんとC++やPythonと比較したいところ。 もうちょっと使ってみようと思います。

  1. LISP詳しくないですがそういう感じらしいです、homoiconicというらしい。ちなみにJuliaのパーザはSchemeで書かれています。 

  2. Juliaで直接 nnz(x $ y) のように書くこともできますが、Cで書いたSSE4のコードの方が手元の環境では3倍ほど速かった