Chinaunix首页 | 论坛 | 博客
  • 博客访问: 56244
  • 博文数量: 4
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 54
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-29 17:19
个人简介

服务器工程师,专注于服务器性能验证、优化及服务器定制。

文章分类

全部博文(4)

文章存档

2015年(2)

2014年(2)

我的朋友

分类: Python/Ruby

2015-09-21 20:41:36

   近期由于同事用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

阅读(2228) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~