python工匠技巧系列案例故事

文章提供了一个Python脚本,用于分析网站访问日志,根据页面响应时间将其分为不同的性能等级(LT_100,LT_300,LT_1000,GT_1000)。脚本首先定义了一个枚举类型PagePerflevel,然后使用自定义的PerflevelDict类处理数据,该类继承自MutableMapping。脚本读取日志文件,统计每个页面在不同性能等级的请求次数,并按等级顺序输出结果。
摘要由CSDN通过智能技术生成

分析网站访问日志

from  enum import Enum
class  PagePerflevel(str,Enum):
    LT_100 = 'Less than 100 ms '
    LT_300 = 'Between 100 and 300 ms '
    LT_1000 = ' Between 300 and 1000 ms'
    GT_1000 = 'Greater than 1 s '
def analyze_v1():
    path_gruops={}
    with open("long.txt","r") as fp:
        for line in fp :
            path,time_cost_str = line.strip().split()
            
            #根据页面耗时计算性能
            time_cost = int(time_cost_str)
            if time_cost < 100 :
                level = PagePerflevel.LT_100
            elif time_cost < 300 :    
                level = PagePerflevel.LT_300
            elif time_cost < 1000 :   
                level = PagePerflevel.LT_1000
            else:
                level = PagePerflevel.GT_1000
            
            #如果路径第一次出现存入初始值
            try:
                path_gruops[path][level] += 1
            except KeyError :
                path_gruops[path][level] = 1
    
    for path,result  in path_gruops.items():
        print(f'  ==  Path :{path}')
        total =sum(result.values())
        print(f' Total requests :{total}')
        print(f'   Performance :')
        
        #在输出结果前,按照“性能等级”在PagePerflevel 里面的排列顺序,小于100毫秒
        #出现在最前面
        sorted_items = sorted(
            result.items(),key= lambda pair : list(PagePerflevel).index(pair[0])
        )
        for level_name ,count in sorted_items:
            print(f'   -{level_name}:{count}')
if __name__ == '__name__':            
    analyze_v1()

用于储存响应时间的自定义字典

#在python中自定义一个字典类型,可以通过继承MutableMapping抽象类来实现,代码如下

from collections import MutableMapping

class PerflevelDict(MutableMapping):

    """ 储存响应时间的自定义字典"""

    def __init__(self):
        self.date = defaultdict(int)
    
    def __getitem__(self, key):
        """当某个键不存在时,默认返回0"""    
        return self.date[self.compute_level(key)]
    
    def __setitem__(self, key, value):
        """将key转化为对应的性能等级,然后设置值"""
        self.date[self.compute_level(key)] = value
        
    def __delitem__(self, key):
        del self.date[key]
        
    def  __iter__ (self):
        return iter(self.data)
    
    def  __len__(self):
        return len(self,.date)
    
    @staticmethod
    def compute_level(time_cost_str):
        """根据响应时间计算性能等级"""
        #假如已经是性能等级,不做转换直接返回
        if time_cost_str  in  list(PagePerflevel):    
            return time_cost_str
        time_cost = int(time_cost_str)
        
        if time_cost < 100:
            return PagePerflevel.LT_100
        elif time_cost < 300: 
            return PagePerflevel.LT_300
        elif time_cost < 1000:
            return PagePerflevel.LT_1000
        return PagePerflevel.GT_1000DA

代码重构后的优化代码

#代码重构优化(使用了defaultdict与自定义字典类)
from enum import Enum
from collections import defaultdict
from collections import MutableMapping

class  PagePerflevel(str,Enum):
    LT_100 = 'Less than 100 ms '
    LT_300 = 'Between 100 and 300 ms '
    LT_1000 = ' Between 300 and 1000 ms'
    GT_1000 = 'Greater than 1 s '


# 在python中自定义一个字典类型,可以通过继承MutableMapping抽象类来实现,代码如下

from collections import MutableMapping


class PerflevelDict(MutableMapping):
    """ 储存响应时间的自定义字典"""

    def __init__(self):
        self.date = defaultdict(int)

    def __getitem__(self, key):
        """当某个键不存在时,默认返回0"""
        return self.date[self.compute_level(key)]

    def __setitem__(self, key, value):
        """将key转化为对应的性能等级,然后设置值"""
        self.date[self.compute_level(key)] = value

    def __delitem__(self, key):
        del self.date[key]

    def __iter__(self):
        return iter(self.data)

    def __len__(self):
        return len(self.date)

    @staticmethod
    def compute_level(time_cost_str):
             """根据响应时间计算性能等级"""
             # 假如已经是性能等级,不做转换直接返回
            if time_cost_str in list(PagePerflevel):
                return time_cost_str
            time_cost = int(time_cost_str)

            if time_cost < 100:
                return PagePerflevel.LT_100
            elif time_cost < 300:
                return PagePerflevel.LT_300
            elif time_cost < 1000:
                return PagePerflevel.LT_1000
            return PagePerflevel.GT_1000
    def analyze_v2(self):
        path_groups = defaultdict(PerflevelDict)
        with open("longf.txt",'r') as fp:
            for line in fp:
                path, time_cost = line.strip().split()
                path_groups[path][time_cost] += 1

        for path,result in path_groups.items():
            print(f' == Path :{path}')
            print(f'    Total requests:{result.total_request()} ')
            print(f'    Performance')
            for level_name , count in result.items():
                print(f'   - {level_name}:{count}')

if __name__ =='__name__':
    analyze_v2()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值