首页
登录 | 注册

python与shell awk处理stream文本结果的效率分析

   近期由于同事用C写了一个stream结果的处理的程序,激发了我用其他语言处理相同任务的兴趣,在这里把使用python程序和基于shell awk的处理程序及结果与大家分享。
 分析目标:自动化处理stream测试数据的文本结果,stream结果大约有100000条需要收集的结果(不计不符合的项),处理的文本文件为45MB. 需要将每次stream结果的Scale,Copy,Add,Triad结果的标准偏差(stdev),并且答应出Triad的结果项,用于后续的plot画图。

Shell 使用AWK处理stream.log的代码
  1. #!/bin/bash
  2. echo -ne >Triad.txt
  3. #Get TimeStamp
  4. timestamp=`date "+%Y%m%d%H%M%S" `
  5. # Analysis stream log
  6. awk 'BEGIN{i=0}/^Copy/{
  7. copy_num[i]=$2;copy_sum+=copy_num[i]
  8. }/^Add/{add_num[i]=$2;add_sum+=add_num[i]
  9. }/^Scale/{scale_num[i]=$2;scale_sum+=scale_num[i]
  10. }/^Triad:/{triad_num[i]=$2;triad_sum+=triad_num[i]
  11. i++
  12. }END{
  13. for (val in copy_num){ cp_squaresum+=(copy_num[val]-copy_sum/i)*(copy_num[val]-copy_sum/i)
  14. }{for (val in add_num){ad_squaresum+=(add_num[val]-add_sum/i)*(add_num[val]-add_sum/i)
  15. }{for (val in scale_num){sc_squaresum+=(scale_num[val]-scale_sum/i)*(scale_num[val]-scale_sum/i)
  16. }{for (val in triad_num){tr_squaresum+=(triad_num[val]-triad_sum/i)*(triad_num[val]-triad_sum/i);print val+1","triad_num[val]>>"Triad"'$timestamp'".txt"
  17. }{printf "%13s,%13s,%13s,%13s,%20s\n","Copy","Scale","Add","Triad","TimeStamp" >"Standard_deviation.txt";printf "%14f,%14f,%14f,%14f,%20s\n",sqrt(cp_squaresum/i),sqrt(ad_squaresum/i),sqrt(sc_squaresum/i),sqrt(tr_squaresum/i),"'$timestamp'">>"Standard_deviation.txt"}
  18. }}}}' stream.log
  19. #Plot data
  20. sh plot.sh Triad$timestamp.txt Triad$timestamp.png
shell代码约20行,处理时间:5s ,同事用C完成以上完全相同的任务和输出用了200行,时间约为Shell的二十分之一。

Python的re模块处理结果
  1. #!/usr/bin/python
  2. import time,datetime
  3. import re,string
  4. now=datetime.datetime.now()
  5. timestamp=now.strftime('%Y%m%d%H%M%S')

  6. def get_result(str,file):
  7.     sum=0
  8.     list=[]
  9.     value=0
  10.     filetime=datetime.datetime.now()
  11.     pat=re.compile(str)
  12.     for f in open(file):    
  13.         if pat.search(f):
  14.             value=string.atof(f.split()[1])
  15.             sum+=value
  16.             list=list+[value]
  17.     filetimeend=datetime.datetime.now()
  18. #    print value,sum,list
  19.     num=len(list)
  20.     means=sum/num
  21.     squaresum=0
  22.     
  23.     for i in list:
  24.         squaresum+=(i-means)**2
  25.     stdev=(squaresum/num)**0.5
  26.     print stdev,num,means,sum,i
  27.     if str=='Triad':
  28.         for i,j in enumerate(list):
  29.             with open('Triad'+timestamp+'.txt','a') as fw:
  30.                 fw.writelines("%s,%s\n" % (i+1,j))
  31.     fortimeend=datetime.datetime.now()
  32.     print (filetimeend-filetime),(fortimeend-filetimeend),"s"
  33.          
  34. get_result('Copy','stream.log')
  35. get_result('Add','stream.log')
  36. get_result('Triad','stream.log')
  37. get_result('Scale','stream.log')
python处理时间9s 。 

Python程序经过多次优化后,结果仍不理想,最终定位问题出在python re模块处理的速度较慢,每次调用约2s, 而每次调用用于计算的时间仅0.005s.所以瓶颈在文本分析上。

通过这次的测试结果,对python的效率比较失望,连shell awk都不如,使用的python版本是2.6.6 ,同样修改程序后在python 3.5中测试结果也一样没有提升。

不过python还是比较有趣的语言,虽然入门很快,但要真的用好并不简单。

下图是用time 测试的数据,输入输出稍有不同,但算法都相同。C语言处理用时:0.299s ,awk用时:8.9s ,python用时:11.3s


相关文章

  • 5个Python脚本优化你的网站搜索引擎优化!
    编译了  Python SEO分析器 Python 2.7+,BeautifulSoup4,minidom,nltk,numpy和urllib2. https://github.com/sethblack/python-seo-analyz ...
  • 让我们来比较一下这两种语言,以便更好地理解它们各自的优点. 是一种 Linux/Unix shell 命令语言 非常适合编写使用命令行界面(CLI)实用程序的 shell 脚本,利用一个命令的输出传递给另一个命令(管道),以及执行简单的任务 ...
  • 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列的资源整理.awesome-python 是 vinta 发起维护的 Python 资源列表,内容包括:Web 框架.网络爬虫.网络内容提取.模板引擎.数据库. ...
  • zabbix使用python脚本监控java进程
    作者:撸大师 链接:https://www.jianshu.com/p/172118ca0262 前言:目前有个需求,需要对线上几台拥有5个tomcat的服务器添加监控,分别监控各个tomcat的gc.连接数.使用内存等,现成的模板是监控一 ...
  •     本文会介绍使用xpath来获取数据,并附上相应的代码片段来做说明.     lxml是python语言里处理XML以及HTML工作的功能最丰富和最容易使用的库.当然scrapy框架里也是使用xpath来解析数据的.lxml的安装在这 ...
  • [root@localhost /]# [root@localhost /]# cat strduiqi.py #!/bin/python import os, stat li=os.listdir('/software/script/sh ...

2020 unjeep.com webmaster#unjeep.com
12 q. 0.014 s.
苏ICP备12049786号-20