解决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中线程编程之threading模块的使用详解
Jun 23 Python
python实现SMTP邮件发送功能
Jun 16 Python
python使用turtle库与random库绘制雪花
Jun 22 Python
对numpy Array [: ,] 的取值方法详解
Jul 02 Python
Python中的几种矩阵乘法(小结)
Jul 10 Python
分享8点超级有用的Python编程建议(推荐)
Oct 13 Python
手把手教你Python yLab的绘制折线图的画法
Oct 23 Python
Python面向对象程序设计之静态方法、类方法、属性方法原理与用法分析
Mar 23 Python
如何基于python3和Vue实现AES数据加密
Mar 27 Python
python构造IP报文实例
May 05 Python
Pycharm2020最新激活码|永久激活(附最新激活码和插件的详细教程)
Sep 29 Python
Python Selenium破解滑块验证码最新版(GEETEST95%以上通过率)
Jan 29 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生成html分页列表的代码
2007/03/18 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(四)
2014/06/23 PHP
php使用cookie显示用户上次访问网站日期的方法
2015/01/26 PHP
PHP表单数据写入MySQL数据库的代码
2016/05/31 PHP
php微信开发自定义菜单
2016/08/27 PHP
php操纵mysqli数据库的实现方法
2016/09/18 PHP
PHP序列化的四种实现方法与横向对比
2018/11/29 PHP
PHP进阶学习之命名空间基本用法分析
2019/06/18 PHP
Windows平台PHP+IECapt实现网页批量截图并创建缩略图功能详解
2019/08/02 PHP
js操作textarea 常用方法总结
2012/12/03 Javascript
捕获和分析JavaScript Error的方法
2014/03/25 Javascript
javascript的switch用法注意事项分析
2015/02/02 Javascript
触屏中的JavaScript事件分析
2015/02/06 Javascript
js倒计时抢购实例
2015/12/20 Javascript
自动完成的搜索框javascript实现
2016/02/26 Javascript
Angular.js如何从PHP读取后台数据
2016/03/24 Javascript
全面解析Angular中$Apply()及$Digest()的区别
2016/08/04 Javascript
基于angularjs实现图片放大镜效果
2016/08/31 Javascript
jQuery leonaScroll 1.1 自定义滚动条插件(推荐)
2016/09/17 Javascript
VUE 更好的 ajax 上传处理 axios.js实现代码
2017/05/10 Javascript
浅谈es6 javascript的map数据结构
2017/12/14 Javascript
vue项目移动端实现ip输入框问题
2019/03/19 Javascript
JavaScript实现京东放大镜效果
2019/12/03 Javascript
[48:44]2014 DOTA2国际邀请赛中国区预选赛5.21 TongFu VS HGT
2014/05/22 DOTA
Python2.x利用commands模块执行Linux shell命令
2016/03/11 Python
python 类对象和实例对象动态添加方法(分享)
2017/12/31 Python
Python实现直方图均衡基本原理解析
2019/08/08 Python
Python3 虚拟开发环境搭建过程(图文详解)
2020/01/06 Python
python轮询机制控制led实例
2020/05/03 Python
css3实现的下拉菜单效果示例
2014/01/22 HTML / CSS
团队拓展活动总结
2014/08/27 职场文书
医学检验专业自荐信
2014/09/18 职场文书
张家口市高新区党工委群众路线教育实践活动整改方案
2014/10/25 职场文书
2014年工程工作总结
2014/11/25 职场文书
办公楼租房协议书范本
2014/11/25 职场文书
2014年幼儿园园务工作总结
2014/12/05 职场文书