关于我之前项目
HTML提取数据,保存Docx
发表我一些自己的想法和见解。
第一:
还记得数据提取模块所使用的数据提取方式xpath,这个模块
提取出来的是一个<class ‘lxml.etree._Element’>类型的数据,我们可以使用for循环来逐一遍历,针对每一个进行解析处理。
重点来了!!!
如果你只是简单的for循环提取数据,其实速度并不会很慢,和正常的for循环速度差不多,但是我们在for循环的时候要进行数据存储,这个时候,最影响速度的就是文件存储和运行内存了。
因为我们的数据量很大文件会被批量的读写,会加大内存的消耗,python的速度本身就很慢,内存变少的情况下呢,速度就更慢了。
期间呢,我也进行很多次的自救,多线程、预编译、优化代码等,都不是很理想,最后是吧循环和文件读写单独拎出来。
-
多线程
这个看起来很好用,速度也很快,但是他的写入没有顺序,你不知道哪一条线程的速度会快,期间我使用了锁机制,但是很不理想,试了几次之后果断放弃 -
异步协程
这个看起来很高级吧,其实淘汰的原因和多线程一样,写入顺序问题。当然还有最为重要的一点,就是它的实现方式很绕,最后还是淘汰了 -
pandas
pandas在处理excel、csv等数据上,速度很快,我在遇到速度问题的时候第一时间就想到了,文件写入也是顺序的,但是它只是比for循环速度快了那么一点,而且还不利于理解,在我没发现最优解之前,它还是最好的解决办法 -
预编译
这个高级了,我们都知道python在处理速度上就比不上c、java等语言,所以有第三方开发了一个预编译模块叫numba,它会将你编译好的函数先转换为机器语言,然后存在内存中,方便后面的调用,速度相比之前有很大很大的进步原来要几个小时的时间,用上了之后只要二十几分钟就可以运行结束。它虽然速度快,但是也有很大的弊端,就是编译的时候它只会选择自己可以理解的进行编译,导致有很多的变量和第三方库没办法编译上,主要是操作难度太大,最后淘汰了
使用装饰器的方式调用
from numba import jit # 导包
@jit # 装饰器
def main():
# 函数体
- 优化代码
我最后成功的提速使用的就是这一技术。
首先,使用docx模块写入文件的时候开头初始化,结尾再调用保存。在此期间我们不停的向其写入数据,很容易造成内存堆积减少的问题,内存是直接影响运行速度的主要因素之一。我将文件分开保存,之后再进行合并,保证了每一次循环都是同等大小的内存使用,不造成堆积。最后再将数据进行合并,就可以完美的提速。
很多的方法,我都是提供一种思路,实现起来还是需要大家亲力亲为,后续如果有什么问题可以留言讨论