解决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模拟新浪微博登陆功能(新浪微博爬虫)
Dec 24 Python
python实现rest请求api示例
Apr 22 Python
Python入门_浅谈逻辑判断与运算符
May 16 Python
python数据结构链表之单向链表(实例讲解)
Jul 25 Python
Python面向对象之类的内置attr属性示例
Dec 14 Python
浅谈Pandas Series 和 Numpy array中的相同点
Jun 28 Python
python和c语言的主要区别总结
Jul 07 Python
python计算n的阶乘的方法代码
Oct 25 Python
wxpython绘制圆角窗体
Nov 18 Python
python多进程重复加载的解决方式
Dec 13 Python
Matplotlib绘制雷达图和三维图的示例代码
Jan 07 Python
django实现模型字段动态choice的操作
Apr 01 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程序时遇到的三个问题
2012/01/17 PHP
linux环境apache多端口配置虚拟主机的方法深入介绍
2013/06/09 PHP
IIS6.0中配置php服务全过程解析
2013/08/07 PHP
PHP获取浏览器信息类和客户端地理位置的2个方法
2014/04/24 PHP
学习php设计模式 php实现原型模式(prototype)
2015/12/07 PHP
PHP is_array() 检测变量是否是数组的实现方法
2016/06/13 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
2020/04/04 PHP
发现的以前不知道的函数
2006/09/19 Javascript
打造个性化的功能强大的Jquery虚拟键盘(VirtualKeyboard)
2014/10/11 Javascript
jQuery 重复加载错误以及修复方法
2014/12/16 Javascript
Javascript 字符串模板的简单实现
2016/02/13 Javascript
JS创建对象几种不同方法详解
2016/03/01 Javascript
jQuery Ajax页面局部加载方法汇总
2016/06/02 Javascript
jquery.serialize() 函数语法及简单实例
2016/07/08 Javascript
基于JS实现checkbox全选功能实例代码
2016/10/31 Javascript
浅谈JS封闭函数、闭包、内置对象
2017/07/18 Javascript
详解axios 全攻略之基本介绍与使用(GET 与 POST)
2017/09/15 Javascript
JS实现遍历不规则多维数组的方法
2018/03/21 Javascript
详解VS Code使用之Vue工程配置format代码格式化
2019/03/20 Javascript
Vue-axios-post数据后端接不到问题解决
2020/01/09 Javascript
微信小程序保持session会话的方法
2020/03/20 Javascript
python+pandas生成指定日期和重采样的方法
2018/04/11 Python
pandas数据分组和聚合操作方法
2018/04/11 Python
python学习——内置函数、数据结构、标准库的技巧(推荐)
2019/04/18 Python
Python获取基金网站网页内容、使用BeautifulSoup库分析html操作示例
2019/06/04 Python
python列表推导式操作解析
2019/11/26 Python
Python分析最近大火的网剧《隐秘的角落》
2020/07/02 Python
英国票务网站:Ticketmaster英国
2018/08/27 全球购物
漫威玩具服装及周边商品官方购物网站:Marvel Shop
2019/05/11 全球购物
Speedo速比涛德国官方网站:世界领先的泳装品牌
2019/08/26 全球购物
平面设计岗位职责
2013/12/14 职场文书
开展党的群众路线教育实践活动总结报告
2014/10/31 职场文书
郭明义观后感
2015/06/08 职场文书
2016年八一建军节活动总结
2016/04/05 职场文书
2019餐饮行业创业计划书!
2019/06/27 职场文书
一起来学习Python的元组和列表
2022/03/13 Python