作者|Andy Reagan
編譯|VK
來源|Towards Datas Science
在MATLAB和數值計算的世界,for回圈被剪掉,而向量為王,
在我的博士學位期間,Lakoba教授的數值分析課是我參加的最具挑戰性的課程之一,在課程之后,我對向量代碼有了深刻的理解,
我最喜歡的向量化例子是,一位同事在寫了一篇非常酷的論文,對其中所涉及的大量計算做了腳注,與我分享了他的lorenz96代碼,其中,內部的向量化速度比沒有向量化快了4倍,
現在,快速向量代碼使機器學習成為可能,例如QR分解,雖然我還沒做過,但我確信現在我可以用MATLAB或Numpy或Julia撰寫,
我在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=https://www.cnblogs.com/panchuangai/archive/2020/10/05/{'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/vectorizing-matters,
原文鏈接:https://towardsdatascience.com/vectorizing-code-matters-66c5f95ddfd5
歡迎關注磐創AI博客站:
http://panchuang.net/
sklearn機器學習中文官方檔案:
http://sklearn123.com/
歡迎關注磐創博客資源匯總站:
http://docs.panchuang.net/
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/158110.html
標籤:其他
下一篇:多執行緒并發編程的基本問題
