Python開發(fā)很好训裆,但性能在中期成為了瓶頸瞻颂。Numba據(jù)說性能極佳钩骇,因此在試著一個(gè)最簡(jiǎn)單的KNN算法時(shí)比藻,原作是《機(jī)器學(xué)習(xí)實(shí)戰(zhàn)》铝量,加上了Numba的JIT裝飾器幾乎是各種報(bào)錯(cuò)。
- 函數(shù)式寫法易報(bào)錯(cuò)
例子代碼是這樣寫的银亲,在函數(shù)上加JIT是有問題的:
maxCount = 0
for key, value in classCount.items():
if value > maxCount:
maxCount = value
maxIndex = key
return maxIndex
- 但稍微有一點(diǎn)點(diǎn)經(jīng)驗(yàn)的Python程序員也可能會(huì)寫成這個(gè)樣子
maxIndex = max(classCount.items(), key=lambda x: x[0])[0]
這樣寫有問題嗎慢叨?沒有,但Numba的JIT一樣報(bào)錯(cuò)群凶。
3.解決第一個(gè)問題
那么1到底是什么問題插爹,寫過靜態(tài)語言的程序員應(yīng)該知道哄辣,即使不用聲明變量類型请梢,至少也要聲明一下變量吧,因此力穗,例子代碼明顯沒有聲明maxIndex毅弧,于是我猜著加上了聲明,初始化為None,像這樣
maxCount = 0
maxIndex = None
for key, value in classCount.items():
if value > maxCount:
maxCount = value
maxIndex = key
return maxIndex
竟然跑通了....這是什么鬼......当窗。
然而更加令人失望的是够坐,本來3秒的程序硬生生跑到12秒。這當(dāng)然是因?yàn)榇a復(fù)用部分太少導(dǎo)致的(我只是猜的)崖面。不過的確在別的地方有時(shí)候加個(gè)numba會(huì)更好元咙。有時(shí)又是pypy更好,cython提升不會(huì)太大巫员,和C++配合的話成本太高了庶香。號(hào)稱要打敗C++的Rust語言的cpython庫(kù)連例子都build失敗就更別說了。而Grumpy把Python翻譯成Go支持也太弱了简识,況且因?yàn)镻ython解釋型特性我也不期待它能在編譯期提高性能太多赶掖。
當(dāng)然numba依然作為一個(gè)不可忽視的重要工具,此文先到這里七扰,以后繼續(xù)深入再逐一逐一把所有的坑踩完奢赂。