很多同学在研究和学习的过程中都会经常使用 MATLAB。很多时候当编好一个程序之后,我们发现程序运行的效率达不到预想的要求。盲目的去找程序的缺陷往往既花时间也没有什么太大效果。这里我想告诉大家 MATLAB 很重要的功能 – Profiler – 能够帮助你很快找到程序的问题,然后可以很快的提高程序的效率。
当你写完一个程序之后,首先要试着运行。试着运行的时候有两个目的,一个是验证是否正确(这个不在我们讨论的范围),另外就是要看一下效率是否满意。对于后者你要做的是从主界面选择Desktop – Profiler. (见下图)然后从profiler 运行程序(运行的指令和你在这个主界面想运行程序的指令一样, 可以有参数也可以没参数)
Profiler运行的结果也会在主界面显示。其结果与正常的运行的都一样,但是它可以给你显示出运行中每一行所执行的次数和花费的时间(见下图)。
然后你需要重点做的是仔细研究那些花费时间很长的步骤。很多情况下,整个程序里的某一行或者某两行会占据绝大多数的计算时间,而通常那几行都是因为程序写的不好所以效率很低(通常容易出现的问题是,1)重复计算一些可以只计算一次的事情,比如每次循环计算同一个normcdf,而实际你可以事先算好储存在一个数组, 2) 使用太多层的for循环,而实际可以用矩阵计算来代替,3)可以把一些计算有序的结合起来,比如当计算某些乘法的顺序时候,应该刻意安排一些需要计算少的顺序)。在调试中,一般只需要focus在这几行比较花时间的地方,其他的行都可以忽略。
在真正执行大规模的运行之前(当然极为小的程序就无所谓了),我建议先保证占据超过20%计算时间的行的效率已经都达到最优了。(注意当你改完一行之后,可能那行的时间一下就变成接近于0了,然后你应该接着看新的最占据计算时间的行,直到最重要的行都已经最优化为止。)这样会事半功倍。
多数时候,当用MATLAB比较熟练以后,用profiler分析之后立刻就知道自己哪儿没写好(很多时候写的时候就知道,但是不知道会有多大影响,就先按照比较好写的方法写)。总的来说,这是一个非常实用的工具,这篇文章的目的就是希望没有使用过的同学能够知道,会大大提高你们使用MATLAB的效率。
注:虽然此文是针对MATLAB的Profiler,但对于其他科学计算语言(如Python),也有类似的功能,使用好类似的工具可以帮助大家很快的提升科学计算的程序水平。