如何用Numba正确加速Python Pandas类的__init__方法?
问题描述
我有一个循环执行各类数学计算的类,想借助Numba提升处理速度,尝试将Numba应用到该类的__init__方法时多次报错。类及其__init__方法代码如下:
class Generic(object): #@numba.vectorize def __init__(self, N, N1, S1, S2): A = [['Time'],['Time','Price'], ["Time", 'Qty'], ['Time', 'Open_interest'], ['Time','Operation','Quantity']] self.table = pd.DataFrame(pd.read_csv('Datasets\\RobotMath\\table_OI.csv')) self.Reader() for a in A: if 'Time' in a: self.df = pd.DataFrame(pd.read_csv(Ex2_Csv, usecols=a, parse_dates=[0])) self.df['Time'] = self.df['Time'].dt.floor("S", 0) self.df['Time'] = pd.to_datetime(self.df['Time']).dt.time if a == ['Time']: self.Tik() elif a == ['Time','Price']: self.Poc() self.Pmm() self.SredPrice() self.Delta_Ema(N, N1) self.Comulative(S1, S2) self.M() elif a == ["Time", 'Qty']: self.Volume() elif a == ['Time', 'Open_interest']: self.Open_intrest() elif a == ['Time','Operation','Quantity']: self.D() #self.Dataset() else: print('Something went wrong', f"Set Error: {0} ".format(a))
该类的所有方法均为基于Pandas的常规列计算,以下是两个示例方法:
def Tik(self): df2 = self.df.groupby('Time').value_counts(ascending=False) df2.to_csv('Datasets\\RobotMath\\Tik.csv', ) def Poc(self): g = self.df.groupby('Time', sort=False) out = (g.last()-g.first()).reset_index() out.to_csv('Datasets\\RobotMath\\Poc.csv', index=False)
请问是否可以直接加速该__init__方法?还是必须通过重写类才能实现性能优化?
解答
无法直接用Numba加速
__init__方法- Numba的核心优化场景是纯数值计算的Python函数,你的
__init__里全是Pandas IO操作、DataFrame列处理、类方法调用,这些都是Numba不支持的——它无法识别Pandas API,也没法处理文件IO、动态属性赋值这类操作,强行加装饰器必然报错。 - 另外,
@numba.vectorize是用来向量化标量函数的,完全不适用于类的初始化方法,属于装饰器用错场景。
- Numba的核心优化场景是纯数值计算的Python函数,你的
不需要重写整个类,优化重点在逻辑重构
- 先解决最大性能浪费:
__init__里多次重复读取同一个CSV文件(Ex2_Csv),每次只取几列。IO操作远慢于计算,应该一次性读取完整CSV,之后按需提取对应列,避免重复IO。 - 针对类中的计算方法:如果方法里有自定义的数值循环逻辑(而非单纯调用Pandas内置方法),可以把这部分逻辑抽成纯函数,用
@numba.njit装饰器加速;但如果只是调用groupby、value_counts这类Pandas内置方法,这些方法本身已是C扩展优化过的,Numba帮不上忙,反而可能拖慢速度。 - 其他细节优化:合并
self.df['Time']的转换步骤,避免重复处理;保持groupby的sort=False设置(已在Poc中使用);导出CSV的操作若能批量处理,可进一步减少IO开销。
- 先解决最大性能浪费:
内容的提问来源于stack exchange,提问作者Genry
相关产品推荐
相关产品推荐

