若是您有任何疑問,請在下面發表評論。
大數據部落 -中國專業的第三方數據服務提供商,提供定製化的一站式數據挖掘和統計分析諮詢服務
統計分析和數據挖掘諮詢服務:y0.cn/teradat(諮詢服務請聯繫官網客服)
【服務場景】
科研項目; 公司項目外包;線上線下一對一培訓;數據爬蟲採集;學術研究;報告撰寫;市場調查。
【大數據部落】提供定製化的一站式數據挖掘和統計分析諮詢
歡迎選修咱們的R語言數據分析挖掘必知必會課程!
摘要:在計算能力爲王的時代,具備高性能計算的庫正在被普遍你們應用於處理大數據。例如:Numpy,本文介紹了一個新的Python庫——Numba, 在計算性能方面,它比Numpy表現的更好。數據庫
最近我在觀看一些SciPy2017會議的視頻,偶然發現關於Numba的來歷--講述了那些C++的高手們由於對Gil Forsyth和Lorena Barba失去信心而編寫的一個庫。雖然本人以爲這個作法有些不妥,但我真的很喜歡他們所分享的知識。由於我發現本身正在受益於這個庫,而且從Python代碼中得到了使人難以置信的表現,因此我以爲應該要寫一些關於Numba庫的介紹性文章,也可能會在未來添加一系列小的更多相似教程的文章。數組
1.那麼到底什麼是Numba?微信
Numba是一個庫,能夠在運行時將Python代碼編譯爲本地機器指令,而不會強制大幅度的改變普通的Python代碼(稍後再作說明)。翻譯/魔術是使用LLVM編譯器完成的,該編譯器是至關活躍的開源社區開發的。app
Numba最初是由Continuum Analytics內部開發,此公司也開發了著名的Anaconda,但如今它是開源的。核心應用領域是math-heavy(密集數學?重型數學?)和array-oriented(面向數組)的功能,它們在本地Python中至關緩慢。想象一下,在Python中編寫一個模塊,必須一個元素接着一個元素的循環遍歷一個很是大的數組來執行一些計算,而不能使用向量操做來重寫。這是很很差的主意,是吧?因此「一般」這類庫函數是用C / C ++或Fortran編寫的,編譯後,在Python中做爲外部庫使用。Numba這類函數也能夠寫在普通的Python模塊中,並且運行速度的差異正在逐漸縮小。函數
2.怎麼才能get到Numba呢?工具
安裝Numba的推薦方法是使用conda包管理post
你也能夠用pip來安裝Numba,可是最新版本的發佈才一天之久。可是,只要你可以使用conda,我會推薦使用它,由於它可以爲你安裝例如CUDA工具包,也許你想讓你的Python代碼GPU就緒(固然,這也是有可能的!)。性能
3.如何使用Numba呢?學習
使用它的要求很少。基本上,你寫一個本身的「普通」的Python函數,而後給函數定義添加一個裝飾。你可使用不一樣類型的裝飾器,但@jit多是剛開始的選擇之一。其餘裝飾器可用於例如建立numpy通用功能@vectorize或編寫將在CUDA GPU上執行的代碼@cuda。我不會在這篇文章中介紹這些裝飾。如今,讓咱們來看看基本的步驟。他們提供的代碼示例是2d數組的求和函數,如下是代碼:大數據
正如你所看到的,Numba裝飾器被添加到函數定義中,而且voilá這個函數將運行得很快。可是,這裏帶來了頗有趣的注意事項:你只能使用Numpy和標準庫裏的函數來加快Numba速度,甚至不須要開了他們全部的特性。見here是所支持Python的功能和here是所支持的Numpy功能。如今支持的功能可能還不太多,但我想告訴你,這就夠了!請記住,Numba不是要加快你的數據庫查詢或如何強化圖像處理功能。他們的目標是加快面向數組的計算,咱們可使用它們庫中提供的函數來解決。
4.示例和速度比較
熟練的Python用戶永遠不會使用上述代碼實現sum功能,而是調用numpy.sum。相反,我將向你介紹另一個例子,爲了更好地理解這個例子,也許剛開始是一個小的背景故事。
從我所學習的知識來看,我會認爲本身是一個水文學家,我作的不少的一件事是模擬降雨徑流過程。簡單點來講:經過時間序列數據,例如雨量和空氣溫度,而後嘗試建立模型來判斷一條河流的水流量有多少。這在外行看來是很是複雜。但,對於咱們來講,很簡單。咱們一般使用的模塊迭代輸入數組,而且對於每一個時間步長,咱們會更新一些模塊內部的狀態(例如,模擬土壤水分,積雪或攔截水中的樹木)。在每一個時間段結束時,計算水流量,這不只取決於在同一時間步長下的雨,並且也取決於在內部模型狀態(或儲存)。在這種狀況下,咱們就須要考慮之前時間步長的狀態和輸出。那麼你可能會看到這個問題:咱們必須一段時間接一段時間的計算整個流程,而對於解決這種問題Python原本就是很慢的!這就是爲何大多數模塊都是在Fortran或C/C ++中實現的。如前所述:Python在對於這種面向數組的計算來講是慢的。可是Numba容許咱們在Python中作一樣的事情,並且沒有太多的性能損失。我認爲至少對於模型的理解和發展,這可能會很方便。
Okay,如今咱們來看看咱們get到了什麼。咱們將使用最簡單的模塊之一,由MB Fiering在1967年出於教育目的開發的ABC模型,並將Python代碼的速度與Numba優化後Python代碼和Fortran實現進行比較。請注意這個模型不是咱們在現實中使用的(正如名稱所示),可是我認爲這多是一個不錯的想法來舉例。
A、B、C模塊是一個三個參數模塊(a,b,c,習慣性命名),它只接收下雨量爲輸入,只有一個存儲。土壤水分蒸發蒸騰損失總量(參數b),另外一部分經過土壤滲透到地下水儲存(參數a),最後一個參數c表明地下水總量,離開地下變成河流。Python中的代碼,使用Numpy數組可能會像以下所示:
接下來咱們使用Numba來實現相同的功能。
我用隨機數字做爲輸入來運行這些模塊,這只是爲了比較計算時間,並且也比較了針對fortran實現的時間(詳見here)。咱們來看看數字:
經過添加一個裝飾器,咱們的計算速度比純Python代碼快222倍,甚至比Fortran也快不少。在計算能力決定將來的時代,Numba必定會被更多人接受。
以上就是個人介紹,但願有人如今有動力去看看Numba庫。我想在未來我會編寫一系列小的Numba文章/教程,並提供更多的技術信息,讓更多的人使用Numba 庫。而本文僅做爲一個開始。
大數據部落 -中國專業的第三方數據服務提供商,提供定製化的一站式數據挖掘和統計分析諮詢服務
統計分析和數據挖掘諮詢服務:y0.cn/teradat(諮詢服務請聯繫官網客服)
【服務場景】
科研項目; 公司項目外包;線上線下一對一培訓;數據爬蟲採集;學術研究;報告撰寫;市場調查。
【大數據部落】提供定製化的一站式數據挖掘和統計分析諮詢
歡迎選修咱們的R語言數據分析挖掘必知必會課程!