
# 用这段代码来测试两种算法的优劣
import numpy as np
import timeit
import matplotlib.pyplot as plt
def compute_info(x): # 计算信息量的函数
hist = np.zeros(256) # 创建一个长度为256的零数组,用于记录每个字节符号的出现次数
for k in x: # 遍历输入字节流
hist[k] = hist[k] + 1 # 统计每个字节符号的出现次数
p = hist / x.size # 计算每个符号的概率(频率)
p = np.where(p == 0, np.spacing(1), p) # 将概率为0的符号替换为能显示的最小的数,以避免对数计算中的无穷大
self_info = -np.log2(p) # 计算每个符号的信息量
info = np.sum(p * self_info) # 计算总体信息量
return info # 返回信息量
def compute_info_fast(x): # 更快的方法计算信息量
(hist, bin_edges) = np.histogram(x, bins=range(257))
p = hist / x.size
p = np.where(p == 0, np.spacing(1), p) # 将概率为0的符号替换为能显示的最小的数,以避免对数计算中的无穷大
self_info = -np.log2(p) # 计算每个符号的信息量
info = np.sum(p * self_info) # 计算总体信息量
return info # 返回信息量
times_1=[] # 定义一个空列表times_1,存储算法1的运行时间
times_2=[] # 定义一个空列表times_2,存储算法2的运行时间
List=range(1, 50) # 创建一个包含1到50的整数列表
for i in List:
x_len = 1024 * i # 测试数据长度
symbol = 1 # 符号值
x = np.full(x_len, symbol, dtype=np.uint8) # 创建一个全为1的数组
compute_Info = compute_info(x)
#分别使用不同的方法计算信息量
compute_Info = compute_info(x) # 计算信息量
print('compute_info计算的信息量为:', compute_Info)
#print("time(compute_info) =", timeit.timeit("compute_info(x)", number=10, globals=globals()), "sec\n")
time1 = timeit.timeit('compute_info(x)', globals=globals(), number=10)
compute_Info_fast = compute_info_fast(x) # 计算信息量
print('compute_info_fast计算的信息量为:', compute_Info_fast)
#print("time(compute_info_fast) =", timeit.timeit("compute_info_fast(x)", number=10, globals=globals()), "sec\n")
time2 = timeit.timeit('compute_info_fast(x)', globals=globals(), number=10)
# 将运算得到的数据存入列表
times_1.append(time1)
times_2.append(time2)
# 根据times_1和times_2的值绘制折线图,比较两种算法的计算性能
print("compute_info_time =",times_1) # 打印times_1的值
print("compute_info_fast_time =",times_2) # 打印times_2的值
# 绘制折线图
plt.figure(figsize=(10, 6)) # 设置图形大小
plt.plot(List, times_1, marker='o', label='compute_info') # 绘制折线图,设置标记为圆圈,并添加标签
plt.plot(List, times_2, marker='s', label='compute_info_fast') # 绘制折线图,设置标记为正方形,并添加标签
plt.xlabel('Number_of_Bytes*1024') # 设置x轴标签
plt.ylabel('Execution Time (seconds)') # 设置y轴标签
#plt.xscale('log') # 对x轴进行对数缩放
plt.yscale('log') # 对y轴进行对数缩放
plt.title('Comparison of Algorithm Execution Times') # 设置图形标题
plt.legend() # 显示图例
plt.grid(True) # 显示网格线
plt.show() # 显示图形
# 运行结果显示如下:
'''
List=range(1,10)时
compute_info计算的信息量为: 2.944311461305915e-12
compute_info_fast计算的信息量为: 2.944311461305915e-12
compute_info_time = [0.0022864999918965623, 0.005430799996247515, 0.007217000005766749, 0.009682699994300492, 0.013206699994043447, 0.01482130000658799, 0.01742530000046827, 0.020997200001147576, 0.03022830000554677]
compute_info_fast_time = [0.0008208000072045252, 0.0008806999976513907, 0.0018591999978525564, 0.0014361999928951263, 0.001061900009517558, 0.001268099993467331, 0.0011626000050455332, 0.001412400000845082, 0.0015688999992562458]
'''
# 可以看出,使用compute_info_fast计算方法可以大大提高计算速度。