我正在使用 Golang 为具有超过 30000 个可能标签的数据集实现朴素贝叶斯分类。我已经建立了模型,我正处于分类阶段。我正在对 1000 条记录进行分类,这最多需要 5 分钟。我已经使用 pprof 功能对代码进行了分析;前 10 名如下所示:Total: 28896 samples 16408 56.8% 56.8% 24129 83.5% runtime.mapaccess1_faststr 4977 17.2% 74.0% 4977 17.2% runtime.aeshashbody 2552 8.8% 82.8% 2552 8.8% runtime.memeqbody 1468 5.1% 87.9% 28112 97.3% main.(*Classifier).calcProbs 861 3.0% 90.9% 861 3.0% math.Log 435 1.5% 92.4% 435 1.5% runtime.markspan 267 0.9% 93.3% 302 1.0% MHeap_AllocLocked 187 0.6% 94.0% 187 0.6% runtime.aeshashstr 183 0.6% 94.6% 1137 3.9% runtime.mallocgc 127 0.4% 95.0% 988 3.4% math.log10令人惊讶的是,地图访问似乎是瓶颈。有没有人经历过这个。还有什么其他的键值数据结构可以用来避免这个瓶颈?所有地图访问都在下面给出的以下代码段中完成:func (nb *Classifier) calcProbs(data string) *BoundedPriorityQueue{ probs := &BoundedPriorityQueue{} heap.Init(probs) terms := strings.Split(data, " ") for class, prob := range nb.classProb{ condProb := prob clsProbs := nb.model[class] for _, term := range terms{ termProb := clsProbs[term] if termProb != 0{ condProb += math.Log10(termProb) }else{ condProb += -6 //math.Log10(0.000001) } } entry := &Item{ value: class, priority: condProb, } heap.Push(probs,entry) } return probs}映射是 nb.classProb,map[string]float64而 nb.model 是类型的嵌套映射map[string]map[string]float64
2 回答
米脂
TA贡献1836条经验 获得超3个赞
除了@tomwilde 所说的之外,另一种可以加快算法速度的方法是字符串实习。也就是说,如果您提前知道键的域,则可以完全避免使用映射。我写了一个小包,可以为你做字符串实习。
- 2 回答
- 0 关注
- 233 浏览
添加回答
举报
0/150
提交
取消