一 利用pandas進行矢量化操作
一般情況下,我們肯定不能用for 循環的方式來處理數據
再不然用df.itertuples 或 df.iterrows,來實現循環遍歷,
再不然用apply()去作用與每行數據,
利用pandas操作的最好的方式還是矢量化操作,這樣才能最大化的發揮pandas的優勢
參考這篇文章提到的
https://blog.csdn.net/BF02jgtRS00XKtCx/article/details/90092161
二 利用numba加速
處理最好的採用矢量化的操作方式之外,在pandas的官方文檔中,也介紹瞭如何利用numba來加速pandas處理的數據,我們知道numba是對numpy 函數 以及循環有很好的加速效果,但是對pandas默認是不支持的,pandas的官方文檔給出了一個實例方法
邏輯就是把pandas中的Series轉化爲numpy的ndarray,然後利用函數作用於ndarray,在函數上價格jit裝飾器,從而將代碼直接轉化爲機器碼,實現加速效果
參考連接
https://pandas.pydata.org/pandas-docs/stable/user_guide/enhancingperf.html?highlight=numba
參考代碼
import numba
@numba.jit
def f_plain(x):
return x * (x - 1)
@numba.jit
def integrate_f_numba(a, b, N):
s = 0
dx = (b - a) / N
for i in range(N):
s += f_plain(a + i * dx)
return s * dx
@numba.jit
def apply_integrate_f_numba(col_a, col_b, col_N):
n = len(col_N)
result = np.empty(n, dtype='float64')
assert len(col_a) == len(col_b) == n
for i in range(n):
result[i] = integrate_f_numba(col_a[i], col_b[i], col_N[i])
return result
def compute_numba(df):
result = apply_integrate_f_numba(df['a'].to_numpy(),
df['b'].to_numpy(),
df['N'].to_numpy())
return pd.Series(result, index=df.index, name='result')
三 利用pandas.eval() 其實也算是個小的tip
pandas的eval函數對大型的數組有很好的加速作用
參考官方文檔
https://pandas.pydata.org/pandas-docs/stable/user_guide/enhancingperf.html?highlight=numba