TinySegmenterをJulia移植したらMITの先生に指導してもらえた話
上の記事がTLで結構話題になっていて,そういえば昔TinySegmenterをD言語で実装したなぁと掘り起こした(TinySegmenter written in D).5年前のコードだったけど最新版でもさっくりと動いたので,どれくらいか比較のためにベンチマークを取ってみた.
結果としては,Juliaには勝てなかった.コードを読んだ限り,Julia実装は他のとは違って中間のsegmentsリストを作らなかったりとか最適化がちょくちょく入っているので,この辺D言語でも頑張れば近いパフォーマンスは出せそう.
ベンチマークしたのは手元のMBP.それぞれの処理系は*env
で入れたりhomebrew
を使って入れたりした.
- Processor: 2.6 GHz Intel Core i7
- Memory: 16 GB 1600 MHz DDR3
上の記事のベンチマーク結果は,Pythonのベンチマークだけループ回数が100じゃなくて10だったり,Juliaの実装にTC1などのスコアリングがなかったりといくつか完璧ではないので,修正した後にchezouさんが再度計測しなおすと思われます(すでに本人には報告済み).
以下手元でのベンチマーク結果.速かった順.
masterだとTC1とかの修正が入ってます.
1
2
3
| % julia -L ../src/TinySegmenter.jl benchmark.jl
8.887454 seconds (5.04 M allocations: 253.778 MB, 0.53% gc time)
|
1
2
3
| % ~/ldc2-0.16.0-beta2-osx-x86_64/bin/ldc2 tinysegmenter.d -O3 -boundscheck=off -inline -release -run benchmark.d
segment: 14 secs, 923 ms, and 352 μs
|
1
2
3
| % node benchmark.js
82.42sec
|
高速化したバージョン.パッチはすでに本家に投げました(Improve performance by repeatedly · Pull Request #1 · 6/tiny_segmenter)
1
2
3
| % RUBYLIB=./lib ruby benchmark.rb
user system total real
segment 110.560000 0.800000 111.360000 (111.823173)
|
Python 2の方は3.5に比べて遅いらしいのでやってない.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| % python tinysegmenter3.py
## benchmarker: release 4.0.1 (for python)
## python version: 3.5.0
## python compiler: GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.72)
## python platform: Darwin-15.0.0-x86_64-i386-64bit
## python executable: /Users/repeatedly/.pyenv/versions/3.5.0/bin/python
## cpu model: Intel(R) Core(TM) i7-4960HQ CPU @ 2.60GHz
## parameters: loop=1, cycle=1, extra=0
## real (total = user + sys)
tokenize 181.4310 181.0800 180.2500 0.8300
## Ranking real
tokenize 181.4310 (100.0) ********************
## Matrix real [01]
[01] tokenize 181.4310 100.0
|