You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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__方法?还是必须通过重写类才能实现性能优化?


解答
  1. 无法直接用Numba加速__init__方法

    • Numba的核心优化场景是纯数值计算的Python函数,你的__init__里全是Pandas IO操作、DataFrame列处理、类方法调用,这些都是Numba不支持的——它无法识别Pandas API,也没法处理文件IO、动态属性赋值这类操作,强行加装饰器必然报错。
    • 另外,@numba.vectorize是用来向量化标量函数的,完全不适用于类的初始化方法,属于装饰器用错场景。
  2. 不需要重写整个类,优化重点在逻辑重构

    • 先解决最大性能浪费:__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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 05:50:28