分析网站访问日志
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()