向量化代碼

做者|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/

相關文章
相關標籤/搜索