☞ ░ 前往老猿Python博文目录

一、引言

老猿在将自己的博文数据(包括url地址、标题和阅读数量)从博客中获取后,使用xlwings保存到excel对象时发现,不同的处理方法性能相差非常大。

案例程序每次获取博文数据后,对新的博文将其信息保存到excel,对老的博文则将其数据更新,每次处理的阅读量单列一列,存储数据类似如下:



前面两列分别为url和标题,后面随着处理次数增多会有多列数据记录下访问时间及当时的博文阅读数量,涉及处理的博文有900多篇,阅读量数据有近10列。

二、案例背景说明

本案例中只以输出阅读量数据为例,阅读量位于第三列开始,保存在二维列表urlReadInfoList中,二维列表中的元素也是列表,每个列表保存一行数据的多列阅读量。在初始输出时,老猿使用如下语句:

def saveArticlesInfo():
......
logPag("将文章阅读数量填入excel对象中...")
line = 2 #第一行为标题,从第二行开始保存
for readinfo in urlReadInfoList:
sheet.range(line,3).value = readinfo #一次输出一行
line += 1
logPag("设置excel数据的宽度...")

上面是拷贝了saveArticlesInfo的部分代码,其中使用的函数logPag是将对应参数信息前加一个输出时刻的具体时间值之后再输出,以跟踪代码耗时。

针对这900多行10列的阅读量数据处理耗时近1分钟,具体输出信息如下:

20200704 211802: 将文章阅读数量填入excel对象中...
20200704 211858: 设置excel数据的宽度...

三、优化措施

为了提高效率,老猿将其采用以列为单位输出,为了保证前期代码不用修改,在此输出时做了个变换处理,将阅读量数据的行和列的维度交换了一下,下面是交换函数:

def exchangeLineColumn(array):
columncount = len(array[0])
rowcount = len(array)
columnData = []
for i in range(columncount):
columnData.append([]) for line in array:
columnPos = 0
for column in line:
columnData[columnPos].append(column)
columnPos += 1
return columnData

然后在输出前调用该交换函数,将交换后的数据以列为单位输出。代码如下:

   logPag("将文章阅读数量填入excel对象中...")
# line = 2
# for readinfo in urlReadInfoList:
# sheet.range(line,3).value = readinfo
# line += 1
readInfoList= exchangeLineColumn(urlReadInfoList)
columnno = 3 #阅读量从第2行3列开始
for readinfo in readInfoList:
sheet.range(2,columnno).options(transpose=True).value = readinfo
columnno += 1
logPag("设置excel数据的宽度...")

最后看运行结果:

20200704 214611: 将文章阅读数量填入excel对象中...
20200704 214611: 设置excel数据的宽度...

以上输出结果可以看到,处理用时不到1秒,效率至少提高了60倍。

补充说明:

其实上面的方式还可以更好地解决办法,就是一次性写入多行多列:

   logPag("将文章阅读数量填入excel对象中...")
sheet.range("C2").value = urlReadInfoList
# line = 2
# for readinfo in urlReadInfoList:
# sheet.range(line,3).value = readinfo
# line += 1
#readInfoList= exchangeLineColumn(urlReadInfoList)
#columnno = 3
#for readinfo in readInfoList:
# sheet.range(2,columnno).options(transpose=True).value = readinfo
# columnno += 1
logPag("设置excel数据的宽度...")

四、结论

使用xlwings操作excel时,对行和列的访问尽量避免单个单元数据访问,使用整行或整列数据操作时,最好是一次性尽可能操作多的数据,如果行列数据分布极度不均时这可以大幅提高效率。

具体操作方法请参考《Python学习随笔:使用xlwings设置和操作excel多行多列数据以及设置数据字体颜色填充色对齐方式的方法》。

跟老猿学Python、学5G!

☞ ░ 前往老猿Python博文目录

一个使用xlwings操作excel数据优化60倍处理效率的案例的更多相关文章

  1. C#操作Excel数据增删改查(转)

    C#操作Excel数据增删改查. 首先创建ExcelDB.xlsx文件,并添加两张工作表. 工作表1: UserInfo表,字段:UserId.UserName.Age.Address.CreateT ...

  2. C#操作Excel数据增删改查示例

    Excel数据增删改查我们可以使用c#进行操作,首先创建ExcelDB.xlsx文件,并添加两张工作表,接下按照下面的操作步骤即可 C#操作Excel数据增删改查. 首先创建ExcelDB.xlsx文 ...

  3. python中操作excel数据 封装成一个类

    本文用python中openpyxl库,封装成excel数据的读写方法 from openpyxl import load_workbook from openpyxl.worksheet.works ...

  4. C# 操作Excel数据透视表

    一.概述 数据透视表(Pivot Table)是一种交互式的表,可以进行某些计算,如求和与计数等,可动态地改变透视表版面布置,也可以重新安排行号.列标和页字段.当改变版面布置时,数据透视表也会按照新的 ...

  5. python中操作excel数据

    python操作excel,python有提供库 本文介绍openpyxl,他只支持新型的excell( xlsx)格式,读取速度还可以 1.安装 pip install openpyxl 2.使用 ...

  6. org.apache.poi.ss.usermodel 类操作excel数据遗漏

    直接上图. 错误程序: 循环读取每一行的单元格数据部分 //for (int j = row.getFirstCellNum(); j < row.getLastCellNum(); j++) ...

  7. xlwings 操作 excel

    xlwings: xlwings是一个Python库,它使Python的一些数据分析特性可以在Excel实例中使用,包括对numpy数组.pandas Series和DataFrame的支持.与其他任 ...

  8. Delphi - 操作Excel数据公式的实现

    procedure TF_SMP_FT_NEW.RzBitBtn_StartToChangeClick(Sender: TObject); var i, j, ni, nj, iRows, iCol, ...

  9. matlab操作Excel数据

    sheet是Excel的表格,xIRange是表格的列的范围 指定xlRange,例如使用语法'C1:C2',其中C1和C2是定义要读取的区百域的两个度相对的角. 例如,'D2:H4'表示工作表上的两 ...

随机推荐

  1. 「SCOI2012」喵星球上的点名

    「SCOI2012」喵星球上的点名 先咕着,扔个code跑路 code #include<bits/stdc++.h> #define vec vector #define iter it ...

  2. 快速傅里叶变换(FFT)学习笔记(其一)

    再探快速傅里叶变换(FFT)学习笔记(其一) 目录 再探快速傅里叶变换(FFT)学习笔记(其一) 写在前面 为什么写这篇博客 一些约定 前置知识 多项式卷积 多项式的系数表达式和点值表达式 单位根及其 ...

  3. tp3.2 php sdk上传七牛云

    //获取上传token Vendor('sdk.autoload'); $accessKey='********'; $secretKey='*******'; $auth=new \Qiniu\Au ...

  4. StringUtil字符串工具-功能扩展

    对java的String类的一些小补充. public class StringUtil { /** 将一个字符串的首字母大写然后返回. @param str 要处理的目标字符串. @return S ...

  5. CDC(跨时钟域)和亚稳态

  6. CSS属性(CSS盒子模型)

    1.CSS盒子模型 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset=&q ...

  7. MySQL 的常用引擎

    1. InnoDB InnoDB 的存储文件有两个,后缀名分别是 .frm 和 .idb,其中 .frm 是表的定义文件,而 idb 是数据文件. InnoDB 中存在表锁和行锁,不过行锁是在命中索引 ...

  8. cakephp中sql查询大于

    $list = $this->Capital->find('all', array('conditions'=>array('amount >'=>0)));

  9. vue中实时监听移动端屏幕高度(采坑后实践)

    最近做微信公众号活动,需要首页往input中输入内容,点击input软键盘tabbar被顶起来,网上借鉴很多(踩了许多坑)最后自己实践出来. <--!将手机屏幕的默认高度和实时高度获取--> ...

  10. Xrepo:一个现代化的跨平台 C/C++ 包管理器

    xrepo 是一个基于 Xmake 的跨平台 C/C++ 包管理器. 项目源码 官方文档 它基于 xmake 提供的运行时,但却是一个完整独立的包管理程序,相比 vcpkg/homebrew 此类包管 ...