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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 15:27:22