開篇
python語言被廣泛用于數據分析和機器學習。但是,由于python的底層特性,python的運行速率低一直被廣泛詬病。其中,numpy和pandas的廣泛使用已經將數據處理和機器學習的速率提升了幾個檔次。
但是,隨著數據的越來越多,很多人已經不再滿足numpy和pandas的速度,從而退出了一批加速優化拓展包。這篇文章主要介紹一個輕量、但是功能強大的python擴展包 ”NumExpr",看看它是如何高效解析數學公式的。
NumExpr
NumExpr的使用及其簡單,只需要將原來的numpy語句使用雙引號框起來,并使用numexpr中的evaluate方法調用即可。
第一步:需要引入 numexpr 和 numpy 擴展包;
/`import numexpr as ne
import numpy as np/`
第二步:創建兩個numpy的array - a 和 b;
a和b兩個所包含的數據個數為100萬個。
當我們需要執行簡單的加減乘除的時候,numexpr的效率已經得到了很好地體現,通過執行 2 * a + 3 * b,如果直接操作,需要3.39 毫秒。但是,如果我們是用ne.evaluate加速,可以將時間縮短至1.55 毫秒。
numexpr在更加復雜的數學表達式運算中,表現到底如何呢?
當我們使用如上所示的數學表達式,正常執行需要28.3 ms。而通過numexpr的加速,只需要3.03 ms。
注意,numexpr是可以識別 sin 函數的,所以我們不需要在evaluate里面寫np.sin,可以直接寫 sin。
總結:處理數據量越大,數學計算越復雜,則numexpr的加速效果越明顯。
numpy 和 numexpr 比較
我們可以看到,當np.array的元素個數超過10e8,加速效果更加顯著。
numexpr也支持邏輯表達式和復數表達式的加速,有興趣的讀者朋友可以自行比較。
numexpr 多線程加速
numexpr還有一個重要的加速利器,多線程操作。通過 ne.set/_num/_threads(1) 可以設置線程的數量,更多的線程表示程序可以同時對數學表達式進行計算。
如上所示,如果我們設置單線程,程序運行需要13.4 ms。設置了雙線程,速度則可以提升一倍。
numexpr對pandas的加速
numexpr的設計主要針對的是numpy。同樣的,我們知道pandas也是基于numpy開發的。自然,numexpr同樣可以被用來對pandas加速。
pandas中有一個eval方法就是運用了numexpr,對pandas代碼進行優化加速。
當我們構建幾個pandas的dataframe,然后對它們進行運算的時候,pd.eval 可以將程序從原先的47.4 ms 加速到17.6 ms。
總結
通過以上的實例,numexpr對于numpy和pandas的加速是很顯著的,尤其當數據量比較大和計算比較復雜的情況下。同時,numexpr的使用非常簡單。但是,我們需要注意的是,任何加速工具都會有局限性的,并不是所有的工作都可以使用numexpr進行加速。
審核編輯 黃昊宇
-
機器學習
+關注
關注
66文章
8428瀏覽量
132845 -
python
+關注
關注
56文章
4801瀏覽量
84878
發布評論請先 登錄
相關推薦
評論