在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的性能提升实测的主要内容,如果未能解决你的问题,请参考以下文章

spring赌上未来的一击:WebFlux性能实测

在 python 中使用 StringIO 的 read() 获取数据失败

编程语言性能实测,Go 和 Python谁更牛?

我们应该使用 pandas.compat.StringIO 还是 Python 2/3 StringIO?

python中的StringIO在现实中是做啥用的?

python 在内存中读写:StringIO / BytesIO