逐步提高代码的执行效率 —— 一次小实践

最近,让组里的一个新人写一个小工具,统计日志文件里面不同的时间点出现的次数(行数),找出其中的最大值。

第一次,新人是这样做的:

    1. 循环读取文件的每一行,并执行命令“grep xxx | wc -l”,然后将结果输出到一个中间文件里;

    2. 遍历上一步生成的中间文件,找出不同时间点出现的最大次数。

代码写好后,开始执行程序,结果直接卡死了……分析原因:上面第1步,等于把文件的每一行都在整个文件中搜索了一遍,这明显是没有必要的,因为相同的时间点只要搜索一次就够了。

因此,最直观的的改进方法也就是避免重复搜索相同的时间点,即在每次执行grep之前,先判断一下当前时间点是不是已经搜索过了,如果已经搜索过了则跳过。

代码修改好,再次执行程序,虽然没有卡死,但也执行的非常慢。进一步分析原因,虽然经过上一步的改进,相同的时间点不再重复搜索了,但是每个不同的时间点仍然需要遍历整个文件。而我们的日志文件中时间是递增的,也就是说相同的时间肯定是连续出现的,不存在跳跃的情况。这样分析后,想到的解决办法就是不再使用grep命令全文搜索了,而是逐行统计,把每个时间点的统计结果记到一个字典( {time:count})里面:如果当前行的时间点与正在搜索的时间点相同,则当前时间点统计数+1,如果不同,则当前时间点的统计结束,在统计字典中加入当前时间点的统计量,继续下一个时间点的统计。这样,整个文件只需要遍历一遍,即可得到每个时间点的统计量,然后从字典里面把这个最大值找出来就可以了。

代码修改好,再次执行程序,这次就快了很多了。但这还没结束,还有没有更简单、更高效的办法呢?这个工具要的功能是找出日志文件中出现次数最多的那个时间点的出现次数,并不需要知道每个时间点的出现次数。也就是说上一步遍历整个文件时生成的那个字典,其实完全可以省略掉,方法很简单,只要加一个变量比如“max_count”,每个时间点统计结束后即与这个“max_count”比较,如果这个时间点的统计值比“max_count”大,那就用这个时间点的统计值更新“max_count”,这样整个文件遍历一遍后,出现次数最多的那个时间点的统计值也就出来了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值