解决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 相关文章推荐
教你如何在Django 1.6中正确使用 Signal
Jun 22 Python
剖析Django中模版标签的解析与参数传递
Jul 21 Python
Python环境下安装使用异步任务队列包Celery的基础教程
May 07 Python
Python中查看文件名和文件路径
Mar 31 Python
利用Python操作消息队列RabbitMQ的方法教程
Jul 19 Python
Python实现正弦信号的时域波形和频谱图示例【基于matplotlib】
May 04 Python
Django rest framework实现分页的示例
May 24 Python
PyQt编程之如何在屏幕中央显示窗体的实例
Jun 18 Python
python机器学习实现决策树
Nov 11 Python
基于pytorch的lstm参数使用详解
Jan 14 Python
浅谈keras中Dropout在预测过程中是否仍要起作用
Jul 09 Python
利用Python实现Picgo图床工具
Nov 23 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
封装一个PDO数据库操作类代码
2009/09/09 PHP
PHP使用GIFEncoder类生成gif动态滚动字幕
2014/07/01 PHP
ThinkPHP快速入门实例教程之数据分页
2014/07/01 PHP
php运行提示:Fatal error Allowed memory size内存不足的解决方法
2014/12/17 PHP
php pdo连接数据库操作示例
2019/11/18 PHP
动态创建的表格单元格中的事件实现代码
2008/12/30 Javascript
js+JQuery返回顶部功能如何实现
2012/12/03 Javascript
图片轮换效果实现代码(点击按钮停止执行)
2013/04/12 Javascript
javascript学习笔记(六)数据类型和JSON格式
2014/10/08 Javascript
jquery中ajax使用error调试错误的方法
2015/02/08 Javascript
JS简单实现String转Date的方法
2016/03/02 Javascript
浅谈JavaScript中的分支结构
2016/07/01 Javascript
浅谈JavaScript 覆盖原型以及更改原型
2016/08/31 Javascript
让浏览器崩溃的12行JS代码(DoS攻击分析及防御)
2016/10/10 Javascript
EasyUI为Numberbox添加blur事件的方法
2017/03/05 Javascript
js实现一个猜数字游戏
2017/03/31 Javascript
vue中使用refs定位dom出现undefined的解决方法
2017/12/21 Javascript
vue 自定义全局方法,在组件里面的使用介绍
2018/02/28 Javascript
Vue-router 中hash模式和history模式的区别
2018/07/24 Javascript
详解微信小程序input标签正则初体验
2018/08/18 Javascript
Vue中mintui的field实现blur和focus事件的方法
2018/08/25 Javascript
vue-cli3.0+element-ui上传组件el-upload的使用
2018/12/03 Javascript
vue实现的双向数据绑定操作示例
2018/12/04 Javascript
微信小程序授权登录解决方案的代码实例(含未通过授权解决方案)
2019/05/10 Javascript
浅谈如何优雅处理JavaScript异步错误
2019/11/12 Javascript
Python3 实现串口两进程同时读写
2019/06/12 Python
利用python计算windows全盘文件md5值的脚本
2019/07/27 Python
Python3使用腾讯云文字识别(腾讯OCR)提取图片中的文字内容实例详解
2020/02/18 Python
JupyterNotebook 输出窗口的显示效果调整实现
2020/09/22 Python
HTML5本地存储之Web Storage应用介绍
2013/01/06 HTML / CSS
美国婚礼和派对礼品网站:Kate Aspen(新娘送礼会、迎婴派对)
2018/03/28 全球购物
耐克奥地利官网:Nike奥地利
2019/08/16 全球购物
仓库组长岗位职责
2014/01/29 职场文书
法院信息化建设方案
2014/05/21 职场文书
离婚财产分隔协议书
2014/10/23 职场文书
解决mysql问题:由于找不到MSVCR120.dll,无法继续执行代码
2021/06/26 MySQL