You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化太阳耀斑撞击地球年份模拟代码的运行速度

太阳耀斑模拟程序性能优化方案

你这段代码的性能损耗主要来自几个没必要的开销,按下面的方向改能快至少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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 14:51:18