一 利用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