关于 Python 导出 excel 快慢的问题

2020-02-02 16:20:33 +08:00
 chenqh

我现在导出 excel, 大小 9m,接近 10m, 数据 接近 4w 条,居然要 40S,而且我感觉我也没有做什么呀

  1. 使用xlwt这个库
  2. 定义一个 headers, 元素为("cell 名字", "对应的字段", "宽度")
  3. 从数据库查询数据,转换一下时间格式,做了一些整除操作, 等等
    按理来讲不会这么慢呀!!
3864 次点击
所在节点    Python
26 条回复
suotm
2020-02-02 16:34:17 +08:00
导出成 CSV,然后用 excel 导入?
superrichman
2020-02-02 16:42:45 +08:00
帖代码出来,看你怎么写的
chenqh
2020-02-02 16:52:07 +08:00
@superrichman 一般导出 4w 条,要多久?
dlsflh
2020-02-02 16:57:01 +08:00
贴代码吧,我一般用 pandas 做。
jjx
2020-02-02 16:58:05 +08:00
以前测算过, 具体数字我忘了, 是很慢

换 openpxy writeonly 模式

pypy 能明显提速

性能比起 go 等静态语言来完全不能比
jjx
2020-02-02 17:00:20 +08:00
@jjx openpyxl 打错了
1462326016
2020-02-02 19:57:53 +08:00
我觉得,问题应该修改为 使用 xlwt 导出 excel 慢
wuwukai007
2020-02-02 20:59:09 +08:00
pandas 底层用的还是 xlwt,用 openpyxl
alpha2016
2020-02-02 21:02:23 +08:00
按一楼说的,写 csv 然后倒入 excel 呢
chenqh
2020-02-02 21:15:26 +08:00
@alpha2016 这个怎么做?
xiaoxinxiaobai
2020-02-02 21:19:21 +08:00
起码分两个部分分析,数据转换耗时,数据写 excel 耗时,或者 profile 跑一下 看看哪部分最耗时
chenqh
2020-02-02 21:30:17 +08:00
@xiaoxinxiaobai 这种网站的怎么 profile 呀,脚本我倒是会 profile
renmu
2020-02-02 21:36:55 +08:00
pandas read_sql () 然后直接 to_excel,应该最方便了
ebingtel
2020-02-02 21:54:04 +08:00
边查询、边返回吧……同样慢,但是会缩短 TTFT 用户体验会好
chenqh
2020-02-02 22:21:23 +08:00
@renmu 关键我有一些转换的呀
so1n
2020-02-02 22:25:53 +08:00
导 csv 再放入 excel 最好,速度快,占内存低……
youthfire
2020-02-02 22:35:39 +08:00
用 pandas+sqlite。我这边一个 32mb,40 万行,作查询和简单处理,基本都是在 2 秒内。当然索引肯定得做。上面有朋友说 pandas 是调用 engine,实际不如直接用 openpyxl,这个结论我亲测过,未必是这样,你可以自己试试。
zwy100e72
2020-02-02 22:39:05 +08:00
建议楼主拿出 Pycharm,跑一次 profile 性能测试,你就能更好的评估 40s 究竟花在了什么地方
有了相关数据才好决策到底是要换什么
xiaoxinxiaobai
2020-02-02 22:49:10 +08:00
我理解这是个接口调用?在接口代码里添加些 profile 代码,保存结果到文件然后分析下,可以搜一些例子
mituxiaomanong
2020-02-03 01:38:39 +08:00
一般几十万数据几秒就可以了,检查数据查询部分和构建 excel 部分循环是否有多余代码

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/641633

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX