"结巴"(Jieba)中文分词系列性能评测

总是有人会问说 CppJieba 性能如何啊之类的,有没有什么评测啊之类的, 一直没有仔细对比过并不是因为对自己的代码没信心,主要是觉得性能评测本身是一件很费工夫的事情, 因为要考虑到分词的算法是否一致,分词的词库是否一致,分词的用法是否正确,这个过程得做到白盒测试才是公平的。

不过最近把 NodeJieba 1.0 版本完成之后,突然好奇的想对比一下 NodeJiebaCppJieba 的性能,毕竟 NodeJiebaCppJieba+V8+js 搞出来的,理论上后者肯定更低,但是低多少就让我很好奇了。所以就开始了性能测试。 然后测完之后就想顺便也把 JiebaJiebago 也测了,毕竟我对 Python 和 go 也都熟悉。 测起来不费事。其他语言的暂且不测了。

性能测试

测试机器是同一台机器,低配MacBookAir。

测试过程也是一样:

先按行读取文本围城到一个数组里,然后循环对围城每行文字作为一个句子进行分词。因为只对围城这本书分词一遍太快了,容易误差。 所以循环对围城这本书分词50次。基本上每次分词耗时都很稳定。 分词算法都是采用【精确模式】

【耗时数据平均值如下,从低到高排序。】

语言 源码 耗时
C++版本 CppJieba 7.6 s
Node.js版本 NodeJieba 10.2 s
go语言版本 GoJieba 9.12 s
go语言版本 Jiebago 67.4 s
Python版本 Jieba 89.6 s

注明:以上耗时都是计算分词过程的耗时,不包括词典载入的耗时。

测试的源码分别如下:

测试源码 分词源码 版本信息
CppJieba Performance Test CppJieba v3.0.0
NodeJieba Performance Test NodeJieba v1.0.3
GoJieba Performance Test GoJieba v0.9.3
Jiebago Performance Test Jiebago v0.3.2
Jieba Performance Test Jieba v0.32

这些时间数据本身没什么意义,因为在不同机器上跑出来的都不一样。 但是他们之间的对比是有意义的。

拿最低的基准数据 CppJieba 的耗时 7.6s 作为参照物。那么其他程序的耗时分别是:

分词源码 耗时倍数
NodeJieba 1.34 * CppJieba
GoJieba 1.2 * CppJieba
Jiebago 8.86 * CppJieba
Jieba 11.79 * CppJieba

【结果分析】

  • CppJieba 性能最高这个符合我的预期,因为自己在它的开发过程也一直在考虑性能方面。
  • NodeJiebaCppJieba 包装而来的,所以我觉得耗时在1倍多一点是正常的。
  • GoJiebaNodeJieba 同理,也是 CppJieba 包装而来的,所以我也觉得耗时在1倍多一点是正常的。
  • Jiebago 这么高的耗时就完全不正常了,毕竟是go语言写的,简单翻阅过源码,可优化空间还是很大的。
  • Jieba 耗时确实比较多,应该也有不小的优化空间,但是我想说的是,性能不是唯一标准,简单易用也很重要,Jieba依然非常优秀的国产开源软件明星。

最后

这次的评测只是纯洁的各语言版本的实现评测,希望不要陷入语言孰优孰劣的争论,没什么意义。

转载请注明出处: "结巴"(Jieba)中文分词系列性能评测