ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Python处理Excel太慢?试试这个库

Python处理Excel太慢?试试这个库 如果你用过pd.read_excel()读取几十万行的.xlsx文件大概率经历过这样的场景泡好一杯咖啡敲下回车盯着终端里那个不动的光标等了五分钟还没出结果。问题不在你的代码逻辑而在 pandas 默认的 Excel 解析引擎。慢在哪里.xlsx本质上是一个 ZIP 压缩包里面是一堆 XML 文件。pandas 读取 Excel 时默认调用 openpyxl 引擎它需要先解压、再逐层解析 XML 树最后把数据填充到 DataFrame 中。这套流程处理几千行数据尚可一旦行数突破十万性能就会断崖式下跌。某电商团队实测过一组数据处理含 3 个工作表、各 10 万行×50 列的 Excel 文件openpyxl 逐行读取耗时47 分钟内存占用 1.2GB即便启用只读模式也需要 18 秒但会丢失所有格式信息。pandas 全表加载虽然把时间压到了 23 秒内存却飙升到 3.8GB。对于日常需要反复读写 Excel 的数据工程师来说这个速度显然不够用。读取换上 calamine 引擎pandas 2.2.0 引入了一个新的读取引擎——calamine。它底层调用的python-calamine是 Rust 库 calamine 的 Python 绑定专门为高效读取电子表格而设计。官方基准测试显示calamine 读取同一文件的速度最高可达 openpyxl 的5 倍、odf 引擎的20 倍。更直观的数据来自一次实际测试读取 50 万行数据calamine 仅用3.58 秒而 pandas 默认引擎需要32.98 秒差距接近10 倍。启用方式简单得不像话只需确保 pandas 版本不低于 2.2.0然后安装python-calaminebash复制下载pip install python-calamine然后在代码中指定引擎python复制下载import pandas as pd df pd.read_excel(large_file.xlsx, enginecalamine)calamine 支持.xlsx、.xlsm、.xls、.xlsb以及.ods格式并且对.xlsb文件还额外支持日期时间识别这是此前只有pyxlsb才能做到的事情。唯一需要注意的是calamine 只负责读取不支持写入和样式操作所以它适合“拿数据”而非“做报表”。如果你不依赖 pandas也可以直接使用python-calamine的底层接口或者选择fastexcel——另一个基于 calamine 和 Apache Arrow 的读取库它支持零拷贝数据交换在 Polars 生态中作为read_excel的默认引擎官方给出的提速幅度约为8-10 倍。写入PyExcelerate 解决另一半问题读的问题解决了写呢openpyxl 逐行追加写入 10 万行×50 列的数据耗时32 分钟文件体积 18.7MBpandas 配合 xlsxwriter 写入同一份数据需要38 秒。如果写入是数据管道的最后一环这个时间成本同样不可接受。PyExcelerate是为写入而生的加速库。它的设计思路很直接绕过 openpyxl 逐单元格操作的繁琐流程改用批量写入模式。benchmark 数据显示写入 1000 行×100 列的数据PyExcelerate 的最快模式仅需0.47 秒而 openpyxl 需要2.74 秒xlsxwriter 需要0.84 秒。在更大规模的数据集上PyExcelerate 写入近 10 万行数据耗时约54 秒而 XlsxWriter 需要117 秒同时内存占用也更低644MB vs 930MB。使用方式同样简洁python复制下载from pyexcelerate import Workbook data [[1, 2, 3], [4, 5, 6], [7, 8, 9]] wb Workbook() wb.new_sheet(Sheet1, datadata) wb.save(output.xlsx)PyExcelerate 支持通过range方法批量写入一块区域比逐单元格设置值快得多如果需要公式、日期等特殊格式也可以用set_cell_value精细控制。选型建议与工程实践把读取和写入分开看选型思路就很清晰了只需要读数据做分析优先用pd.read_excel(enginecalamine)一行代码完成替换提速 5-10 倍。需要写入大量数据用 PyExcelerate 替代 openpyxl 的写入流程。两者都需要且依赖 pandas 生态读用 calamine写用 pandas xlsxwriter 组合在速度和功能之间取得平衡。还有几个容易被忽略的细节值得注意。文件格式本身就决定了速度上限.xlsb是二进制格式解析速度天然快于.xlsx如果数据交换场景允许把中间文件转为 CSV 再处理性能还会再上一个台阶。避免在循环中反复打开和关闭工作簿这是很多初学者代码中隐藏的性能杀手。对超大数据集做分块处理pandas 的chunksize参数配合 calamine 引擎可以在有限内存中流式处理远超内存容量的文件。Excel 不是数据库但现实中大量数据确实以 Excel 的形式流转。与其忍受pd.read_excel()的缓慢不如花五分钟换一个引擎把节省下来的时间用在真正需要思考的地方。
返回列表