做者|Andy Reagan
編譯|VK
來源|Towards Datas Sciencepython
在MATLAB和數值計算的世界,for循環被剪掉,而向量爲王。git
在個人博士學位期間,Lakoba教授的數值分析課是我參加的最具挑戰性的課程之一,在課程以後,我對向量代碼有了深入的理解。github
我最喜歡的向量化例子是,一位同事在寫了一篇很是酷的論文,對其中所涉及的大量計算作了腳註,與我分享了他的lorenz96代碼。其中,內部的向量化速度比沒有向量化快了4倍。數組
如今,快速向量代碼使機器學習成爲可能。例如QR分解,雖然我還沒作過,但我確信如今我能夠用MATLAB或Numpy或Julia編寫。app
我在MassMutual作的不少工做基本上都是數值計算,一條耗時數小時與耗時數秒的管道之間的差別巨大。秒意味着咱們能夠迭代,嘗試更多的選項。不過,爲了靈活性,不少數值代碼都是用純Python(沒有Cython,沒有Numba)編寫的。我要說這是個壞想法!下面是一封同事的轉述郵件:機器學習
在僞代碼中,這是幾個月前我遇到的「精算」編碼難題:EOM = 0
for months in years:
PREM = 50
BOM = EOM + PREM
WIT = 5
EOM = BOM – WIT函數一個簡單的例子,可是我認爲顯示了BOM/EOM的相互依賴性(還有一些其餘變量具備類似的關係)。你不能在不知道EOM的狀況下對BOM進行向量化,並且在知道BOM以前也不能對EOM進行向量化。若是WIT>0,PREM=0。基本上會出現不少相互依賴的狀況。如今不少函數都不容易出現向量化。性能
好吧,我能夠向量化這個,我作到了。如下是Python中的非向量化版本:學習
import numpy as np years = 10 bom = np.zeros(years*12) eom = np.zeros(years*12) for month in range(1, years*12): prem = 50 bom[month] = eom[month-1] + prem wit = 5 eom[month] = bom[month] - wit
這是向量化版本:編碼
import numpy as np years = 10 prem = 50 wit = 5 eom = np.arange(years*12)*prem - np.arange(years*12)*wit # 若是你仍但願將bom表做爲數組: bom = eom + np.arange(years*12)*wit
我還經過使用一系列字典來編寫for循環:
years = 10 prem = 50 wit = 5 result = [{'bom': 0, 'eom': 0}] for month in range(1, years*12): inner = {} inner.update({'bom': result[month-1]['eom'] + prem}) inner.update({'eom': inner['bom'] - wit}) result.append(inner)
上面的這個返回一個不一樣類型的東西,一個dict列表…而不是兩個數組。
咱們還能夠導入Pandas來填充上述三個結果的結果(所以它們是一致的輸出,咱們能夠保存到excel中,等等)。若是加載了Pandas,則可使用空數據幀進行迭代,所以還有一個選項:
import numpy as np import pandas as pd years = 10 prem = 50 wit = 5 df = pd.DataFrame(data={'bom': np.zeros(years*12), 'eom': np.zeros(years*12)}) for i, row in df.iterrows(): if i > 0: row.bom = df.loc[i-1, 'eom'] row.eom = row.bom - wit
對於全部這些類型的迭代,以及返回數據幀做爲結果的選項,咱們獲得的結果是:
Cython 和Numba
我還添加了一些Cython版本的代碼,說明使用C能夠在不使用numpy的狀況下得到向量化的性能,這確實可能在可讀性還有速度之間達到最佳平衡(保持for循環!)。
Numba也能夠加速(它可能和Cython/Vectorized Numpy同樣快)。在這兩種狀況下(Cython/Numba),你必須當心使用哪些數據類型(由於沒有dicts或pandas!)。我認爲,若是你對如何集成Cython+Numpy循環更聰明的話,它將有可能使Cython+Numpy循環與向量化Numpy同樣快。
全部代碼,包括Cython,均可以在這裏找到:https://github.com/andyreagan...。
原文連接:https://towardsdatascience.co...
歡迎關注磐創AI博客站:
http://panchuang.net/
sklearn機器學習中文官方文檔:
http://sklearn123.com/
歡迎關注磐創博客資源彙總站:
http://docs.panchuang.net/