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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:24:05