解决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中MySQLdb模块用法实例
Nov 10 Python
Python装饰器decorator用法实例
Nov 10 Python
python获取当前时间对应unix时间戳的方法
May 15 Python
深入理解Python对Json的解析
Feb 14 Python
Python利用QQ邮箱发送邮件的实现方法(分享)
Jun 09 Python
利用Python3分析sitemap.xml并抓取导出全站链接详解
Jul 04 Python
一个Python最简单的接口自动化框架
Jan 02 Python
wtfPython—Python中一组有趣微妙的代码【收藏】
Aug 31 Python
Python2和Python3中urllib库中urlencode的使用注意事项
Nov 26 Python
python高斯分布概率密度函数的使用详解
Jul 10 Python
python装饰器相当于函数的调用方式
Dec 27 Python
Python如何批量获取文件夹的大小并保存
Mar 31 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中strtotime函数用法详解
2014/11/15 PHP
PHP实现获取中英文首字母
2015/06/19 PHP
PHP使用phpunit进行单元测试示例
2019/09/23 PHP
js的Boolean对象初始值示例
2014/03/04 Javascript
JS实现关键字搜索时的相关下拉字段效果
2014/08/05 Javascript
javascript设计模式之中介者模式Mediator
2014/12/30 Javascript
使用window.prompt()实现弹出用户输入的对话框
2015/04/13 Javascript
JavaScript事件类型中UI事件详解
2016/01/14 Javascript
jQuery插件实现表格隔行变色及鼠标滑过高亮显示效果代码
2016/02/25 Javascript
javascript中利用柯里化函数实现bind方法
2016/04/29 Javascript
Ionic实现页面下拉刷新(ion-refresher)功能代码
2016/06/03 Javascript
JS+Canvas实现的俄罗斯方块游戏完整实例
2016/12/12 Javascript
利用JS实现简单的瀑布流加载图片效果
2017/04/22 Javascript
ActiveX控件的使用-js实现打印超市小票功能代码详解
2017/11/22 Javascript
nodejs搭建本地服务器轻松解决跨域问题
2018/03/21 NodeJs
JS获取当前时间的实例代码(昨天、今天、明天)
2018/11/13 Javascript
[02:54]DOTA2英雄基础教程 暗影牧师戴泽
2013/12/05 DOTA
[47:38]Optic vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python psutil模块简单使用实例
2015/04/28 Python
Python常用时间操作总结【取得当前时间、时间函数、应用等】
2017/05/11 Python
Python subprocess库的使用详解
2018/10/26 Python
解决pyinstaller打包pyqt5的问题
2019/01/08 Python
Python实现将蓝底照片转化为白底照片功能完整实例
2019/12/13 Python
python创建文本文件的简单方法
2020/08/30 Python
Django crontab定时任务模块操作方法解析
2020/09/10 Python
在pycharm创建scrapy项目的实现步骤
2020/12/01 Python
利用CSS3实现炫酷的飞机起飞动画
2016/09/17 HTML / CSS
Html5实现iPhone开机界面示例代码
2013/06/30 HTML / CSS
求职面试个人自我评价
2014/02/28 职场文书
综合素质自我评价怎么写
2014/09/14 职场文书
交警正风肃纪剖析材料
2014/10/29 职场文书
贷款工资证明范本
2015/06/12 职场文书
2016优秀班主任个人先进事迹材料
2016/02/26 职场文书
2016年百日安全生产活动总结
2016/04/06 职场文书
详解MySQL InnoDB存储引擎的内存管理
2021/04/08 MySQL
Python-typing: 类型标注与支持 Any类型详解
2021/05/10 Python