如何优化太阳耀斑撞击地球年份模拟代码的运行速度
太阳耀斑模拟程序性能优化方案
你这段代码的性能损耗主要来自几个没必要的开销,按下面的方向改能快至少4倍:
- 砍掉无用的列表存储:你把近百万次模拟的间隔值全存在
Event列表里完全是多余操作,只需要维护「总间隔累加值」「模拟总次数」两个变量,最后直接用总间隔除以总次数就能得到平均值,既省掉了成千上万次列表append的开销,也不用最后遍历整个列表做sum求和,内存占用直接从百MB级降到几乎可以忽略。 - 简化循环分支:原来内层
while True套if/else/break的结构太冗余,不用写显式的break跳转,直接写循环条件累加计数直到命中耀斑即可,能减少不少解释器的分支判断开销。 - 降低高频调用开销:
random.randint()的函数调用成本比random.random()高很多,直接生成0-1的随机浮点数判断是否小于命中概率就行;另外Python访问局部变量比全局变量快不少,把循环里反复用到的随机函数、固定参数都绑到局部作用域,能省掉大量属性查找的时间。 - 修正循环计数:你原来写的
range(1, 999999)实际只跑了999998次模拟,要跑满100万次直接写range(1_000_000)就对了。
优化后代码(完全保留你原来的模拟逻辑,没有改概率规则):
import random def main(): # 高频变量全部放到局部作用域,提升访问速度 random_gen = random.random # 原逻辑:randint(1,100)等于12时命中,单轮命中概率1% hit_threshold = 1 / 100 total_decade_count = 0 total_sim = 1_000_000 base_year = 2022 for _ in range(total_sim): current_decade = 0 while random_gen() >= hit_threshold: current_decade += 1 total_decade_count += current_decade result_year = int(total_decade_count / total_sim) * 10 + base_year print(f"In the Year {result_year} we got a Solarflare") if __name__ == "__main__": main()
补充:你这个模拟场景是典型的几何分布,独立重复试验单轮命中概率为p时,首次命中的期望试验次数固定为1/p,根本不需要跑百万次循环,直接数学计算可以瞬间出结果:按你现在代码里1%的命中概率,期望间隔是100个decade也就是1000年,算出来的平均耀斑年份就是2022+10010=3022,和百万次模拟的结果几乎完全一致。如果你本来想实现12%的命中概率(和你的变量名percentage_solar_flare=12对应),那把命中阈值改成0.12就行,对应期望年份大概是2105年。*
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

