解决python执行较大excel文件openpyxl慢问题


Posted in Python onMay 15, 2020

我就废话不多说了,大家还是直接看代码吧!

talk is cheap

from openpyxl import Workbook
  from openpyxl.utils import get_column_letter
  from openpyxl import load_workbook
  import time
  wb = load_workbook("E:/a.xlsx", read_only=True)
  sh = wb["Sheet"]
  # rowItem = {}
  # for j in range(1,2000):
  #   for i in range(1, 30):
  #     rowItem[get_column_letter(i)] = i
  #   sh.append(rowItem)
  # wb.save("E:/a.xlsx")
  t0 = time.time()
  print(sh['V500'].value)
  t1 = time.time()
  print("openpyxl所用时间:", str(t1-t0))

  import xlrd
  xlsPath = "E:/a.xlsx"
  WorkBook = xlrd.open_workbook(xlsPath)
  sh = WorkBook.sheet_by_name("Sheet")

  t0 = time.time()
  print(sh.cell(499,22).value)
  t1 = time.time()
  print("xlrd所用时间:", str(t1-t0))

测试结果:

22
openpyxl所用时间: 0.44217610359191895
23.0
xlrd所用时间: 0.0010063648223876953

结论

openpyxl的慢是读取慢,可以选择xlrd代替,详细测试下面继续

不直接使用xlwt+xlrd是因为xlwt仅支持2003及以下版本,最大行数限制在65536,不够用,而openpyxl大概在一百多万

主要的说完了,下面详细说了:在写工具的时候遇到的这个问题,开始是用的xlwt+xlrd,然后行数超标了,没办法换成openpyxl使用excel2007的版本,原本测试不到三万行的数据,只要三四秒,换成openpyxl以后,花了好几分钟,具体没看多少了,然后加上函数运行时间的监视器以后,才看到是读取的时候出的问题

推测原因:

推测的话,openpyxl的根据行号列号读取的时候,是从第一行第一列开始遍历,直到行号等于指定行号,列号等于指定列号,所以要读取的行号列号越多就越慢,(也可能是从第一个有数据的行或列),而xlrd则是类似与数组一样,我们要取第几个元素,直接根据下标找到内存中对应地址的元素即可,所以无论excel总量多少,速度基本都是不变的

留下的坑

xlwt写入仅支持65536行,那xlrd的读取很可能也是,也就是超过这么多的数据可能也会出错

我这里因为是读多表数据生成单表数据,生成方式大概是Na*Nb这样,所以实际读取的不会太多,但生成的很多,所以基本可以用考虑这个问题

另外,据说xlrd读取xlsx格式的偶尔会出现问题,具体没测试,暂时用还没毛病

最后,顺带上一下监控函数运行时间的装饰器吧:

import time
from functools import wraps

def fn_timer(function):
  @wraps(function)
  def function_timer(*args, **kwargs):
    t0 = time.time()
    result = function(*args, **kwargs)
    t1 = time.time()
    print ("Total time running %s: %s seconds" %
      (function.__name__, str(t1-t0))
      )
    return result
  return function_timer

使用方式的话,就是在要监控的函数定义上面加上 @fn_timer 就行了

以上这篇解决python执行较大excel文件openpyxl慢问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
采用python实现简单QQ单用户机器人的方法
Jul 03 Python
python处理文本文件并生成指定格式的文件
Jul 31 Python
python字典序问题实例
Sep 26 Python
Python标准库之itertools库的使用方法
Sep 07 Python
numpy自动生成数组详解
Dec 15 Python
pyqt5的QComboBox 使用模板的具体方法
Sep 06 Python
Python http接口自动化测试框架实现方法示例
Dec 06 Python
利用python实现简易版的贪吃蛇游戏(面向python小白)
Dec 30 Python
在Python中表示一个对象的方法
Jun 25 Python
200行python代码实现2048游戏
Jul 17 Python
Pandas0.25来了千万别错过这10大好用的新功能
Aug 07 Python
Python激活Anaconda环境变量的详细步骤
Jun 08 Python
python可迭代对象去重实例
May 15 #Python
python 操作mysql数据中fetchone()和fetchall()方式
May 15 #Python
Python实现UDP程序通信过程图解
May 15 #Python
解决pymysql cursor.fetchall() 获取不到数据的问题
May 15 #Python
python如何解析复杂sql,实现数据库和表的提取的实例剖析
May 15 #Python
pymysql之cur.fetchall() 和cur.fetchone()用法详解
May 15 #Python
django 利用Q对象与F对象进行查询的实现
May 15 #Python
You might like
一个php Mysql类 可以参考学习熟悉下
2009/06/21 PHP
PHP中常用的转义函数
2014/02/28 PHP
Prototype 学习 工具函数学习($方法)
2009/07/12 Javascript
DIV菜单层实现代码
2010/11/19 Javascript
JS生成不重复随机数组的函数代码
2014/06/10 Javascript
jQuery 实现自动填充邮箱功能(带下拉提示)
2014/10/14 Javascript
详解AngularJS中的依赖注入机制
2015/06/17 Javascript
javascript类型系统 Window对象学习笔记
2016/01/07 Javascript
js计算系统当前日期是星期几的方法
2016/07/14 Javascript
利用angularjs1.4制作的简易滑动门效果
2017/02/28 Javascript
基于JavaScript实现瀑布流效果
2017/03/29 Javascript
Vue键盘事件用法总结
2017/04/18 Javascript
js实现拖拽上传图片功能
2017/08/01 Javascript
Javascript中prototype与__proto__的关系详解
2018/03/11 Javascript
微信小程序实现下拉框功能
2019/07/16 Javascript
详解微信小程序支付流程与梳理
2019/07/16 Javascript
实例分析javascript中的异步
2020/06/02 Javascript
JS寄快递地址智能解析的实现代码
2020/07/16 Javascript
[01:08:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS LGD-CDEC
2014/05/22 DOTA
[04:52]第二届DOTA2亚洲邀请赛主赛事第一天比赛集锦:OG娜迦海妖放大配合谜团大中3人
2017/04/02 DOTA
Python实现爬取知乎神回复简单爬虫代码分享
2015/01/04 Python
Python之str操作方法(详解)
2017/06/19 Python
利用Python批量压缩png方法实例(支持过滤个别文件与文件夹)
2017/07/30 Python
python登录并爬取淘宝信息代码示例
2017/12/09 Python
python3+PyQt5实现柱状图
2018/04/24 Python
python数字图像处理之骨架提取与分水岭算法
2018/04/27 Python
Python 保存矩阵为Excel的实现方法
2019/01/28 Python
python基于TCP实现的文件下载器功能案例
2019/12/10 Python
Python-for循环的内部机制
2020/06/12 Python
python如何利用Mitmproxy抓包
2020/10/10 Python
一文带你了解Python 四种常见基础爬虫方法介绍
2020/12/04 Python
十佳大学生事迹材料
2014/01/29 职场文书
党员教师四风问题整改措施思想汇报
2014/10/08 职场文书
新生儿未入户证明
2015/06/23 职场文书
SpringBoot集成MongoDB实现文件上传的步骤
2022/04/18 MongoDB
nginx配置之并发频次限制
2022/04/18 Servers