如何通过Python接口获取Dymola模型仿真时间及批量仿真模型
获取Dymola模型的仿真时间及优化批量仿真代码
我来帮你解决这两个问题——获取Dymola仿真时间,以及优化你的批量仿真代码:
一、获取仿真时间的两种方式
你需要的仿真时间通常分两种:一种是模型设置的仿真区间时长(比如从0到100秒的配置时长),另一种是Dymola实际运行仿真的耗时(也就是跑模型真正花了多少时间),两种方式的实现如下:
1. 获取仿真区间时长(设置的起止时间差)
通过Dymola的readSimulationSetup接口可以读取模型的仿真配置参数,从中提取StartTime和StopTime计算时长,仿真前后都能调用:
# 读取当前模型的仿真配置 setup = dymola.readSimulationSetup(model) start_time = setup["StartTime"] stop_time = setup["StopTime"] sim_interval_duration = stop_time - start_time print(f"模型 {model} 的仿真区间时长: {sim_interval_duration} 秒")
2. 获取实际仿真运行耗时
用Python的time模块在调用simulateModel前后计时,就能得到Dymola跑这个模型实际消耗的时间:
import time # 仿真前记录开始时间 run_start = time.time() # 执行仿真 result = dymola.simulateModel(model) # 仿真后记录结束时间 run_end = time.time() actual_run_duration = run_end - run_start print(f"模型 {model} 的实际仿真耗时: {actual_run_duration:.2f} 秒")
二、优化你的批量仿真代码
你当前的代码每次循环都新建一个Dymola实例,这会导致重复启动Dymola进程——启动Dymola本身就需要不少时间,批量仿真时这个开销会被放大很多,效率极低。下面是优化后的代码,同时整合了上面的时间获取逻辑:
import platform import time from dymola.dymola_interface import DymolaInterface from dymola.dymola_exception import DymolaException osString = platform.system() isWindows = osString.startswith("Win") # 核心优化:只初始化一次Dymola实例,放在循环外面 dymola = None try: # 启动Dymola dymola = DymolaInterface("C:\\Program Files\\Dymola 2018 FD01\\bin64\\Dymola.exe") print("Dymola实例启动成功") # 读取模型列表 with open('ModelList.txt', 'r') as f: models = f.read().splitlines() # 批量仿真每个模型 for model in models: print(f"\n开始仿真模型: {model}") try: # 可选:如果需要统一设置仿真参数,比如修改起止时间 # dymola.setSimulationSetup(model, {"StartTime": 0, "StopTime": 3600}) # 记录实际运行时间 run_start = time.time() # 仿真模型,指定单独的结果文件路径避免覆盖 result = dymola.simulateModel( model, resultFile=f"./sim_results/{model}_output" ) run_end = time.time() if result: # 获取仿真区间时长 setup = dymola.readSimulationSetup(model) sim_interval = setup["StopTime"] - setup["StartTime"] print(f"✅ 模型 {model} 仿真成功") print(f" 仿真区间时长: {sim_interval} 秒") print(f" 实际运行耗时: {run_end - run_start:.2f} 秒") else: # 获取错误信息便于排查 error_msg = dymola.getLastError() print(f"❌ 模型 {model} 仿真失败") print(f" 错误信息: {error_msg}") except DymolaException as e: print(f"❌ 模型 {model} 处理出错: {str(e)}") finally: # 最后一定要关闭Dymola实例,释放系统资源 if dymola is not None: dymola.close() print("\nDymola实例已关闭")
优化点说明
- 复用Dymola实例:避免每次循环都启动新进程,大幅提升批量仿真的效率
- 独立结果文件:为每个模型指定独特的结果文件路径,防止不同模型的仿真结果被互相覆盖
- 完善错误处理:捕获
DymolaException并获取具体错误信息,方便快速排查问题 - 整合时间获取:同时输出仿真区间时长和实际运行耗时,满足你对不同时间维度的需求
内容的提问来源于stack exchange,提问作者ggoer
相关产品推荐
相关产品推荐

