计算信息量:用这段代码来测试两种算法的优劣

# 用这段代码来测试两种算法的优劣

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计算方法可以大大提高计算速度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值