如何在simpy.Environment.run()中使用tqdm预估仿真耗时?
用tqdm预估SimPy仿真运行时长的实现方案
你原有写法不生效的核心原因是:env.run(until=xxx)是阻塞执行的方法,会直接运行到指定的仿真结束时间才返回结果,且返回值并非可迭代对象,tqdm无法从中捕获进度变化,这个需求是可以实现的。
实现思路
- 将总仿真时长拆分为N个固定步长的小阶段
- 每次调用
env.run()仅执行一个步长的仿真逻辑 - 每跑完一个步长手动更新tqdm进度条
- 循环执行直到达到总仿真时长
可用代码示例
from tqdm.auto import tqdm import simpy # 初始化仿真环境 env = simpy.Environment() # 此处替换为你自己的仿真进程逻辑即可 def your_business_process(env): while True: # 你的业务仿真逻辑 yield env.timeout(1) env.process(your_business_process(env)) # 配置参数 total_sim_time = 100 # 总仿真时长 update_step = 1 # 进度条更新步长,步长越小进度条越顺滑,可按需调整 # 运行仿真并显示进度条 with tqdm(total=total_sim_time) as pbar: current_sim_time = 0 while current_sim_time < total_sim_time: # 避免最后一次执行超过总仿真时长 run_length = min(update_step, total_sim_time - current_sim_time) env.run(until=current_sim_time + run_length) # 更新进度条 pbar.update(run_length) current_sim_time = env.now
注意事项
- 该方案对原有业务代码侵入性极低,仅需要调整仿真启动的逻辑即可
- 若总仿真时长非常大(比如超过10^6),可以调大
update_step参数,减少进度条更新带来的性能损耗 - 如果你的仿真逻辑中存在大量小于步长的离散事件,也可以通过监听仿真事件流更新进度,步长拆分写法的通用性最高
内容的提问来源于stack exchange,提问作者Fly_37
相关产品推荐
相关产品推荐

