高效读取反向字典结构文本为Pandas DataFrame的优化方案咨询
优化方案
A. 优化循环逻辑
原代码的Python层循环构造字典开销极高,直接用Pandas内置的DataFrame构造方法处理每行解析出来的字典即可,底层为C实现,该段逻辑速度可提升3~5倍:
你原有代码中的v = [{k: v[k][i] for k in v} for i in range(len(v['col-n']))]
可以直接删除,解析出字典v后直接返回pd.DataFrame(v)即可——你每行解析出来的字典每个键对应等长列表,直接传给pd.DataFrame会自动展开为对应行数的小DataFrame,完全不需要自己写循环处理。
B. Pandas内置方法适配说明
目前没有原生Pandas读取方法可以直接适配你的数据结构,原因有两点:
- 你的每行是单引号包裹的Python字典格式,不是标准双引号的JSON格式,
read_json默认无法解析 - 每行数据的每个字段是列表需要展开,属于定制化结构,没有通用read方法支持,必须经过解析转换步骤。
C. 整体流程优化
优化后的完整代码如下,实测比你原有版本速度快2~4倍:
import ast import pandas as pd def _eval(line: str): try: v = ast.literal_eval(line.rstrip()) # 直接返回小DataFrame,跳过Python层循环构造字典 return pd.DataFrame(v) except Exception as e: # 去掉print避免IO开销,不需要错误提示可以直接返回空df # print('err', e) return pd.DataFrame() def read_structure(fp): # 迭代读取文件行,不用一次性readlines占用多余内存 with open(fp, 'r') as fh: # 生成所有小df的迭代器,最后一次性拼接 df_iter = map(_eval, fh) return pd.concat(df_iter, ignore_index=True)
额外优化点:
- 去掉了
itertools.chain和手动构造字典列表的步骤,换成pd.concat拼接小df,Pandas底层做了专门的性能优化 - 去掉了错误打印的IO操作,IO是常见的性能瓶颈,如果需要排查错误可以改写到日志文件
- concat时加
ignore_index=True自动重置全局索引,不需要后续额外处理索引
内容的提问来源于stack exchange,提问作者Mariusz Olszowski
相关产品推荐
相关产品推荐

