読者です 読者をやめる 読者になる 読者になる

once upon a time,

Iris Tradをビール片手に聞くのが好きなエンジニアが、機械学習やRubyにまつわる話を書きます

TinySegmenter.jlをGoと比較して負けたと思ったら若者が最適化してくれた

tinysegmenter julia golang nlp

先日、TinySegmenter.jlの話を書いたら各方面から反響を頂きました。

repeatedly.github.io

http://woxtu.tumblr.com/post/132337169740/rust-tinysegmenter
woxtu.tumblr.com

qiita.com

そんな中で、ikawahaさんがGoでも同様の最適化を実装していました。

ikawaha.hateblo.jp

それと比較するために、とりあえずJulia templateをPRして比較しました。

f:id:chezou:20151108175610p:plain

Ruby Perl Python Node.js C++ Go Julia Julia (hash optimized)
132.98 134 111.85 105.31 48 10.50 11.70 10.35

実はTinySegmenterMakerのshogo82148さんが一部のhashのkeyをordしたIntで表現するというさらなる最適化を進めていたので、 ちょっと負けてしまったのですがJuliaのDictを生成するときのhash計算が遅いということをbicycle1885さんが特定してくれたので、Julia本体の最適化が進めば同じくらいにはなりそうだね、ということがわかりました(表のhash optimized)。

ちなみに、SGJ先生は「実は言語間の比較ではなくて最適化の比較になっていたんだけどね(てへぺろ)」みたいなことを告白しており、ikawahaさんの目の付け所は正しかったようです。

そういう意味では、Stringとしても処理できるし頑張れば最適化できるJuliaは楽しいですね、という気持ちになりました。今時のコンパイル型の言語だと突き詰めれば似たような性能になるんでしょうね。