近期由于同事用C写了一个stream结果的处理的程序,激发了我用其他语言处理相同任务的兴趣,在这里把使用python程序和基于shell awk的处理程序及结果与大家分享。
分析目标:自动化处理stream测试数据的文本结果,stream结果大约有100000条需要收集的结果(不计不符合的项),处理的文本文件为45MB. 需要将每次stream结果的Scale,Copy,Add,Triad结果的标准偏差(stdev),并且答应出Triad的结果项,用于后续的plot画图。
Shell 使用AWK处理stream.log的代码
-
#!/bin/bash
-
echo -ne >Triad.txt
-
#Get TimeStamp
-
timestamp=`date "+%Y%m%d%H%M%S" `
-
# Analysis stream log
-
awk 'BEGIN{i=0}/^Copy/{
-
copy_num[i]=$2;copy_sum+=copy_num[i]
-
}/^Add/{add_num[i]=$2;add_sum+=add_num[i]
-
}/^Scale/{scale_num[i]=$2;scale_sum+=scale_num[i]
-
}/^Triad:/{triad_num[i]=$2;triad_sum+=triad_num[i]
-
i++
-
}END{
-
for (val in copy_num){ cp_squaresum+=(copy_num[val]-copy_sum/i)*(copy_num[val]-copy_sum/i)
-
}{for (val in add_num){ad_squaresum+=(add_num[val]-add_sum/i)*(add_num[val]-add_sum/i)
-
}{for (val in scale_num){sc_squaresum+=(scale_num[val]-scale_sum/i)*(scale_num[val]-scale_sum/i)
-
}{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"
-
}{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"}
-
}}}}' stream.log
-
#Plot data
-
sh plot.sh Triad$timestamp.txt Triad$timestamp.png
shell代码约20行,处理时间:5s ,同事用C完成以上完全相同的任务和输出用了200行,时间约为Shell的二十分之一。
Python的re模块处理结果
-
#!/usr/bin/python
-
import time,datetime
-
import re,string
-
now=datetime.datetime.now()
-
timestamp=now.strftime('%Y%m%d%H%M%S')
-
-
def get_result(str,file):
-
sum=0
-
list=[]
-
value=0
-
filetime=datetime.datetime.now()
-
pat=re.compile(str)
-
for f in open(file):
-
if pat.search(f):
-
value=string.atof(f.split()[1])
-
sum+=value
-
list=list+[value]
-
filetimeend=datetime.datetime.now()
-
# print value,sum,list
-
num=len(list)
-
means=sum/num
-
squaresum=0
-
-
for i in list:
-
squaresum+=(i-means)**2
-
stdev=(squaresum/num)**0.5
-
print stdev,num,means,sum,i
-
if str=='Triad':
-
for i,j in enumerate(list):
-
with open('Triad'+timestamp+'.txt','a') as fw:
-
fw.writelines("%s,%s\n" % (i+1,j))
-
fortimeend=datetime.datetime.now()
-
print (filetimeend-filetime),(fortimeend-filetimeend),"s"
-
-
get_result('Copy','stream.log')
-
get_result('Add','stream.log')
-
get_result('Triad','stream.log')
-
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) |