在PYTHON中使用StringIO的性能提升实测
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在PYTHON中使用StringIO的性能提升实测相关的知识,希望对你有一定的参考价值。
刚开始学习PYTHON,感觉到这个语言真的是很好用,可以快速完成功能实现。
最近试着用它完成工作中的一个任务:在Linux服务器中完成对.xml.gz文件的解析,生成.csv文件,以供SqlServer服务器导入,做进一步的数据分析。
解压后的xml文件格式如下:
从廖雪峰博客学习得知目前常用的两种xml解析方式为DOM和SAX,分别进行了尝试,从个人角度来看,还是DOM比较好用,包括应用逻辑以及代码编写,都相对轻松简单。
在尝试SAX解析的过程中,开始按照惯常的方式,对XML文件中筛选的可用字段进行字符串相加,导致的后果是程序运行特别的慢,于是又尝试了cStringIO内存文件,这才感受到了内存文件的速度优势。
下面列出其中的关键字段以作对比。
- 使用字符串相加方式(s为定义的字符串变量):
#处理开始标签 def start_element(self, name, attrs): global d_eNB global d_obj global s if name == ‘eNB‘: d_eNB = attrs elif name == ‘object‘: d_obj = attrs elif name == ‘v‘: s = s + d_eNB[‘id‘]+‘ ‘+ d_obj[‘id‘]+‘ ‘+d_obj[‘MmeUeS1apId‘]+‘ ‘+d_obj[‘MmeGroupId‘]+‘ ‘+d_obj[‘MmeCode‘]+‘ ‘+d_obj[‘TimeStamp‘]+‘ ‘ else: pass
- 使用cStringIO内存文件方式(output为定义的cStringIO变量):
#处理开始标签 def start_element(self, name, attrs): global d_eNB global d_obj if name == ‘eNB‘: d_eNB = attrs elif name == ‘object‘: d_obj = attrs elif name == ‘v‘: output.write(d_eNB[‘id‘]+‘ ‘+ d_obj[‘id‘]+‘ ‘+d_obj[‘MmeUeS1apId‘]+‘ ‘+d_obj[‘MmeGroupId‘]+‘ ‘+d_obj[‘MmeCode‘]+‘ ‘+d_obj[‘TimeStamp‘]+‘ ‘) else: pass
对于一个相同的.xml.gz文件,文件总行数为173890行,其中有用数据为90079行。实测结果如下:
可以看到,在应用了内存文件后,程序的处理性能有了翻天覆地的变化,处理耗时为前者的将近千分之一,赞!!!
测试用的程序和文件可以到我的github页面下载,欢迎小伙伴们一起学习讨论。
以上是关于在PYTHON中使用StringIO的性能提升实测的主要内容,如果未能解决你的问题,请参考以下文章
在 python 中使用 StringIO 的 read() 获取数据失败