Python pandas批量导入CSV生成字典速度慢的代码优化方案
多CSV导入字典速度慢优化方案
核心问题排查
你当前代码跑不动的核心原因是循环逻辑写了笔误:i =+ 1 实际是把i赋值为1,而非自增1,会导致while循环永远满足判定条件陷入死循环,这是运行极慢的首要原因。
除此之外原代码还有几处可以优化的性能损耗点:
- 手动拼接文件路径容易出现格式错误,也有不必要的类型转换开销
- pandas读取CSV时没有限定读取列,会额外解析无用数据
- 单线程逐个读取文件,IO等待时间长
基础优化版本(修复bug+兼容原有逻辑)
这个版本完全保留你需要的字典输出结构,修复死循环问题,做了基础性能优化,不需要额外依赖:
import os import pandas as pd PFC_Dict = {} # 直接遍历文件,不需要手动维护计数索引,从根源避免计数笔误 for file_name in os.listdir(path): dict_key = file_name.split("_")[0] # 用标准方法拼接文件路径,兼容不同系统的路径格式,去掉冗余str转换 file_path = os.path.join(path, file_name) df = pd.read_csv( file_path, sep=";", parse_dates=True, index_col=0, names=["Preis"], decimal=",", dayfirst=True, usecols=[0, 1] # 明确只读取需要的时间、价格两列,减少解析开销 ) # 保留原有的15分钟重采样逻辑 PFC_Dict[dict_key] = df.resample("15min").ffill()
这个版本输出的字典和你预期完全一致:每个key对应独立处理好的DataFrame,可以直接通过PFC_Dict[你的key].index[0]获取单文件起始日期,后续合并、分场景计算的逻辑不需要做任何改动。
进阶提速版本(并行读取,压缩总耗时)
CSV读取属于IO密集型操作,单线程逐个读取会浪费大量磁盘等待时间,用多线程并行处理10个文件,可以把总耗时压缩到接近读取单文件的水平:
import os import pandas as pd from concurrent.futures import ThreadPoolExecutor # 封装单文件读取、处理逻辑 def load_and_resample(file_name, base_path): dict_key = file_name.split("_")[0] file_path = os.path.join(base_path, file_name) df = pd.read_csv( file_path, sep=";", parse_dates=True, index_col=0, names=["Preis"], decimal=",", dayfirst=True, usecols=[0, 1] ) return dict_key, df.resample("15min").ffill() PFC_Dict = {} # 开线程并行处理,线程数可以根据自己的CPU配置调整,一般设为4-8即可 with ThreadPoolExecutor(max_workers=8) as executor: task_list = [executor.submit(load_and_resample, f, path) for f in os.listdir(path)] # 收集处理结果写入字典 for task in task_list: key, processed_df = task.result() PFC_Dict[key] = processed_df
额外优化建议
- 如果这批数据需要反复读取使用,可以把处理好的字典用
pd.to_pickle(PFC_Dict, "processed_pfc.pkl")序列化存储,后续读取速度比读CSV快10倍以上 - 如果对数值精度要求不高,可以在
read_csv参数里加dtype={"Preis": "float32"},减小内存占用的同时也能提升解析速度 - 读取前可以加一层文件过滤,只处理后缀为
.csv的文件,避免把目录下的其他隐藏文件、临时文件读入报错
内容的提问来源于stack exchange,提问作者Florian Eser
相关产品推荐
相关产品推荐

