项目:HTML提取数据,保存Docx(模块之间的关系以及怎么加速for循环处理方式)

关于我之前项目

HTML提取数据,保存Docx
发表我一些自己的想法和见解。

第一:
还记得数据提取模块所使用的数据提取方式xpath,这个模块
提取出来的是一个<class ‘lxml.etree._Element’>类型的数据,我们可以使用for循环来逐一遍历,针对每一个进行解析处理。
重点来了!!!
如果你只是简单的for循环提取数据,其实速度并不会很慢,和正常的for循环速度差不多,但是我们在for循环的时候要进行数据存储,这个时候,最影响速度的就是文件存储和运行内存了。
因为我们的数据量很大文件会被批量的读写,会加大内存的消耗,python的速度本身就很慢,内存变少的情况下呢,速度就更慢了。
期间呢,我也进行很多次的自救,多线程、预编译、优化代码等,都不是很理想,最后是吧循环和文件读写单独拎出来。

  1. 多线程
    这个看起来很好用,速度也很快,但是他的写入没有顺序,你不知道哪一条线程的速度会快,期间我使用了锁机制,但是很不理想,试了几次之后果断放弃

  2. 异步协程
    这个看起来很高级吧,其实淘汰的原因和多线程一样,写入顺序问题。当然还有最为重要的一点,就是它的实现方式很绕,最后还是淘汰了

  3. pandas
    pandas在处理excel、csv等数据上,速度很快,我在遇到速度问题的时候第一时间就想到了,文件写入也是顺序的,但是它只是比for循环速度快了那么一点,而且还不利于理解,在我没发现最优解之前,它还是最好的解决办法

  4. 预编译
    这个高级了,我们都知道python在处理速度上就比不上c、java等语言,所以有第三方开发了一个预编译模块叫numba,它会将你编译好的函数先转换为机器语言,然后存在内存中,方便后面的调用,速度相比之前有很大很大的进步原来要几个小时的时间,用上了之后只要二十几分钟就可以运行结束。它虽然速度快,但是也有很大的弊端,就是编译的时候它只会选择自己可以理解的进行编译,导致有很多的变量和第三方库没办法编译上,主要是操作难度太大,最后淘汰了

使用装饰器的方式调用

from numba import jit   # 导包
@jit   # 装饰器
def main():
	# 函数体
	
  1. 优化代码
    我最后成功的提速使用的就是这一技术。
    首先,使用docx模块写入文件的时候开头初始化,结尾再调用保存。在此期间我们不停的向其写入数据,很容易造成内存堆积减少的问题,内存是直接影响运行速度的主要因素之一。我将文件分开保存,之后再进行合并,保证了每一次循环都是同等大小的内存使用,不造成堆积。最后再将数据进行合并,就可以完美的提速。

很多的方法,我都是提供一种思路,实现起来还是需要大家亲力亲为,后续如果有什么问题可以留言讨论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值