解决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多线程实例教程
Sep 06 Python
Python运用于数据分析的简单教程
Mar 27 Python
使用Python生成url短链接的方法
May 04 Python
python入门教程 python入门神图一张
Mar 05 Python
python数字图像处理之高级形态学处理
Apr 27 Python
python3获取当前目录的实现方法
Jul 29 Python
python爬虫之爬取百度音乐的实现方法
Aug 24 Python
Python print不能立即打印的解决方式
Feb 19 Python
Pytest参数化parametrize使用代码实例
Feb 22 Python
Windows10+anacond+GPU+pytorch安装详细过程
Mar 24 Python
通过实例简单了解Python sys.argv[]使用方法
Aug 04 Python
python 实现aes256加密
Nov 27 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 面向对象程序设计(oop)学习笔记 (五) - PHP 命名空间
2014/06/12 PHP
PHP 前加at符合@的作用解析
2015/07/31 PHP
PHP入门教程之自定义函数用法详解(创建,调用,变量,参数,返回值等)
2016/09/11 PHP
php实现的二叉树遍历算法示例
2017/06/15 PHP
在TP5数据库中四个字段实现无限分类的示例
2019/10/18 PHP
php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
2020/02/28 PHP
slice函数的用法 之不错的应用
2006/12/29 Javascript
jQuery 遍历-nextUntil()方法以及prevUntil()方法的使用介绍
2013/04/26 Javascript
javascript的回调函数应用示例
2014/02/20 Javascript
原生js的弹出层且其内的窗口居中
2014/05/14 Javascript
JavaScript分秒倒计时器实现方法
2015/02/02 Javascript
jQuery遍历DOM元素与节点方法详解
2016/04/14 Javascript
javascript中数组和字符串的方法对比
2016/07/20 Javascript
JavaScript 函数节流详解及方法总结
2017/02/09 Javascript
discuz表情的JS提取方法分析
2017/03/22 Javascript
javascript计算对象长度的方法
2017/10/25 Javascript
javascript代码优化的8点总结
2018/01/29 Javascript
vuex + axios 做登录验证 并且保存登录状态的实例
2018/09/16 Javascript
微信小程序日历效果
2018/12/29 Javascript
JQuery特殊效果和链式调用操作示例
2019/05/13 jQuery
原生JS实现列表内容自动向上滚动效果
2019/05/22 Javascript
微信小程序里引入SVG矢量图标的方法
2019/09/20 Javascript
JS中自定义事件的使用与触发操作实例分析
2019/11/01 Javascript
javascript实现多边形碰撞检测
2020/10/24 Javascript
[02:10]探秘浦东源深体育馆 DOTA2 Supermajor不见不散
2018/05/17 DOTA
一篇不错的Python入门教程
2007/02/08 Python
二种python发送邮件实例讲解(python发邮件附件可以使用email模块实现)
2013/12/03 Python
Tornado Web服务器多进程启动的2个方法
2014/08/04 Python
详解python pandas 分组统计的方法
2019/07/30 Python
Python3操作Excel文件(读写)的简单实例
2019/09/02 Python
专科毕业生求职简历的自我评价
2013/10/12 职场文书
社区端午节活动方案
2014/01/28 职场文书
计算机科学系职业生涯规划书
2014/03/08 职场文书
家长会学生演讲稿
2014/04/26 职场文书
科长竞争上岗演讲稿
2014/05/12 职场文书
2016年记者节感言
2015/12/08 职场文书