我正在运行调用lsqnonlin()1000次的代码。我分析了代码,发现optimoptions()占用了大约40%的时间。相反,我设置了opt1 = optimotpions()一次并将opt1作为参数传递给运行lsqnonlin()的函数,我看到了性能改进。
什么是优化()那么长?
答案 0 :(得分:0)
好的,我们来看看内部optimoptions
函数的作用:
open optimoptions
似乎函数的核心部分由以下行表示:
options = optim.options.createSolverOptions(solverName, varargin{:});
让我们看一下createSolverOptions
函数:
open optim.options.createSolverOptions
宾果!代码中的注释揭示了optimoptions
如果在循环中多次调用可能会对整体性能产生巨大影响的原因:
我们在这里检查是否安装了Global Optimization Toolbox。此外,我们假设在调用此函数之间不会删除这些工具箱文件。
请注意,我们不会在此处执行许可检查,以查看用户是否可以创建一组全局优化工具箱选项。为确保许可证检查正确,我们必须在每次调用此函数时检查许可证。如果在紧密循环中多次调用optimoptions,这将非常昂贵。
因此,我们依赖许可证管理器在用户安装了Global Optimization Toolbox但没有可用许可证的情况下抛出错误。
通过代码中包含的许可证检查,选项对象创建过程大大减慢。最重要的是,optimoptions
函数及其子函数包含try-catch
块中的大量regex
块,for loops
提取和转换,以及其他很好的代码片段。对性能不太友好。