解决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下自己编写web框架的一些要点
Apr 29 Python
Python中将字典转换为列表的方法
Sep 21 Python
Python搭建HTTP服务器和FTP服务器
Mar 09 Python
CentOS 7下Python 2.7升级至Python3.6.1的实战教程
Jul 06 Python
机器学习python实战之手写数字识别
Nov 01 Python
Python机器学习之决策树算法
Dec 22 Python
python3 unicode列表转换为中文的实例
Oct 26 Python
pandas修改DataFrame列名的实现方法
Feb 22 Python
python实现日志按天分割
Jul 22 Python
Django时区详解
Jul 24 Python
使用python 的matplotlib 画轨道实例
Jan 19 Python
python Matplotlib模块的使用
Sep 16 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对文件进行加锁、解锁实例
2015/01/23 PHP
php读取qqwry.dat ip地址定位文件的类实例代码
2016/11/15 PHP
php array_walk 对数组中的每个元素应用用户自定义函数详解
2016/11/18 PHP
PHP配置ZendOpcache插件加速
2019/02/14 PHP
IE6与IE7中,innerHTML获取param的区别
2009/03/15 Javascript
JavaScript对表格或元素按文本,数字或日期排序的方法
2015/05/26 Javascript
JavaScript基本数据类型及值类型和引用类型
2015/08/25 Javascript
AngularJS压缩JS技巧分析
2016/11/08 Javascript
IE8兼容Jquery.validate.js的问题
2016/12/01 Javascript
解析ajaxFileUpload 异步上传文件简单使用
2016/12/30 Javascript
angularjs点击图片放大实现上传图片预览
2017/02/24 Javascript
jQuery实现的上传图片本地预览效果简单示例
2018/03/29 jQuery
jQuery实现可编辑的表格
2019/12/11 jQuery
[49:12]完美世界DOTA2联赛PWL S2 Magma vs GXR 第二场 11.29
2020/12/02 DOTA
python3中set(集合)的语法总结分享
2017/03/24 Python
Python操作mongodb的9个步骤
2018/06/04 Python
在python中以相同顺序shuffle两个list的方法
2018/12/13 Python
pygame实现贪吃蛇游戏(下)
2019/10/29 Python
python 还原梯度下降算法实现一维线性回归
2020/10/22 Python
Pandas之缺失数据的实现
2021/01/06 Python
英国No.1文具和办公用品在线:Euroffice
2016/09/21 全球购物
Stefania Mode美国:奢华设计师和时尚服装
2018/01/07 全球购物
德国的各种媒体在线商店:Thalia.de(书籍、电子书、玩具等)
2020/10/08 全球购物
用JAVA SOCKET编程,读服务器几个字符,再写入本地显示
2012/11/25 面试题
接口中的方法可以是abstract的吗
2015/07/23 面试题
职业生涯规划设计步骤
2014/01/12 职场文书
家长会邀请书
2014/01/25 职场文书
《雪地里的小画家》教学反思
2014/02/22 职场文书
暑期培训随笔感言
2014/03/10 职场文书
房屋租赁协议书
2014/04/10 职场文书
二手房买卖协议书
2014/04/10 职场文书
《分一分》教学反思
2014/04/13 职场文书
2014年行政工作总结
2014/11/19 职场文书
数学复习课教学反思
2016/02/18 职场文书
2016大学先进团支部事迹材料
2016/03/01 职场文书
pytorch加载预训练模型与自己模型不匹配的解决方案
2021/05/13 Python