Pandas实战 | 性能优化




【走在成长的路上】总纲

读取数据优化——时间

  • 数据格式
    • 目前对于数据的读取一般采用——read_csv()函数,读取文件。
    • 优化策略:格式为csv格式,在使用read_csv()函数读取数据时,不同存储格式数据的读取时间关系为xslx>csv>pkl>hdf>h5py,所以应该在首次读取时将海关数据另存为hdf或h5py格式,从而节省之后读取数据的时间。
    • 缺点:hdf或h5py格式文件占用存储空间稍大。

读取数据时预定义数据类型——内存

  • 在使用read_csv()时,设置每类的类型可以在一定程度上节省内存。

统计数据优化 ——时间

  • 在groupby、agg和transform时尽量使用内置函数计算
    • 经过同行实验测试,使用内置函数相对于自定义函数可以降低时间消耗。
    • 例:sum,count,max,min,mean等

避免循环——时间

  • Pandas本就是向量化计算的神器,所以在代码编写过程中,应该多使用向量化计算代码,避免使用循环。

第三方库——时间&内存

  • 需要学习上手,占用项目时间。
  • csvkit

多核计算——时间

多采用内置函数来完成计算和比对——时间

查看DataFrame的内存占用量——内存

  • Dataframe.info()

对数据类型进行选择——内存

  • 同种数据,可以使用多种规格的数据类型,从而减少内存的浪费
  • 将数值型列降级到更高效的类型
  • 将字符串列转换为类别类型category

在操作时避免冗余数据的读取与计算——时间&内存

  • 在读取了原始数据之后,首先确定自己所需要的数据行和列,将需要的数据提取出单独存储后再进行计算。

尽可能的利用numpy进行计算 ——时间

  • DataFrame.apply() 支持参数 raw,为 True 时,直接将 ndarray 输入函数,利用 numpy 并行化加速。

降低DataFrame占用内存的函数代码

#降低DataFrame占用内存的函数代码
def reduce_mem_usage(df, verbose=True):
    numerics = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64']
    start_mem = df.memory_usage().sum() / 1024 ** 2
    for col in df.columns:
        col_type = df[col].dtypes
        if col_type in numerics:
            c_min = df[col].min()
            c_max = df[col].max()
            if str(col_type)[:3] == 'int':
                if c_min > np.iinfo(np.int8).min and c_max < np.iinfo(np.int8).max:
                    df[col] = df[col].astype(np.int8)
                elif c_min > np.iinfo(np.int16).min and c_max < np.iinfo(np.int16).max:
                    df[col] = df[col].astype(np.int16)
                elif c_min > np.iinfo(np.int32).min and c_max < np.iinfo(np.int32).max:
                    df[col] = df[col].astype(np.int32)
                elif c_min > np.iinfo(np.int64).min and c_max < np.iinfo(np.int64).max:
                    df[col] = df[col].astype(np.int64)
            else:
                if c_min > np.finfo(np.float16).min and c_max < np.finfo(np.float16).max:
                    df[col] = df[col].astype(np.float16)
                elif c_min > np.finfo(np.float32).min and c_max < np.finfo(np.float32).max:
                    df[col] = df[col].astype(np.float32)
                else:
                    df[col] = df[col].astype(np.float64)
    end_mem = df.memory_usage().sum() / 1024 ** 2
    if verbose:
        print('Mem. usage decreased to {:5.2f} Mb ({:.1f}% reduction)'.format(
            end_mem, 100 * (start_mem - end_mem) / start_mem))
    return df
上一篇:Pandas实战 DataFrame数据筛选重构——02 【Pandas实战系列目录】 下一篇:Pandas学习 性能优化

你可能感兴趣的:(Pandas实战 | 性能优化)