在MATLAB代码中使用eval('expression')的含义和含义?

Kir*_*sky 1 matlab eval

我在matlab中的其他人的代码中遇到了函数eval(表达式)的使用:例如:

for n = 1 : 4
sn = int2str( n) ;
eval( [ 'saveas( fig'  sn  ', [ sName' sn ' ], ''fig'' ) ' ] );
end
Run Code Online (Sandbox Code Playgroud)

Matlab帮助中MathWorks的东西指出:

eval函数的许多常见用法效率较低,并且比其他MATLAB函数和语言结构更难以阅读和调试.

在此之后,我发现在许多其他程序语言中使用此函数,如Python,JavaScript,PHP.

所以我有几个问题:

  1. 这个函数的使用是否会影响我的代码的性能?
  2. 如果它会减慢执行速度,为什么会发生?
  3. 如果每次调用时都会减慢执行速度,原则上使用此功能的原因是什么?

Chr*_*lor 6

eval功能很危险,实际需要它的例子非常少.例如,如果将图形句柄存储在数组等中并写入fig(1),则可以轻松地重写您提供的代码fig(2)

for n = 1:4
  filename = sprintf('sName%d', n);
  saveas(fig(n), filename, 'fig');
end
Run Code Online (Sandbox Code Playgroud)

更清晰,使用更少的字符,可以通过Matlab编辑器的linter进行分析,如果(何时)需要扩展代码,则更容易修改,并且不易出现奇怪的错误.

根据经验,你不应该使用eval任何语言,除非你真的知道你在做什么(即你正在编写一个复杂的Lisp宏或其他等同于操纵语言的AST的东西 - 如果你不知道那是什么意思是,你可能不需要使用eval).

几乎总是有更清晰,更有效和更危险的方法来实现相同的结果.通常,调用eval可以用某种形式的递归,高阶函数或循环替换.


Jon*_*nas 5

  1. 在这里使用eval肯定比非eval版本慢,但很可能它不会成为你代码的瓶颈.但是,性能只是一个问题,维护(包括调试),以及可读性是其他问题.
  2. 发生减速是因为Matlab使用JIT编译器,并且eval无法优化行.
  3. 在大多数情况下,Eval的使用是由于缺乏对Matlab功能的了解而不适合.在这种特殊情况下,问题是图形句柄存储在名为fig1through的变量名称中fig4.如果它们已存储在一个名为etc 的数组中fig,那就没必要了.fig(1)eval

编辑以下是Loren Shure关于为什么eval要在Matlab中避免的两篇优秀文章.避开eval,以及更多有关eval的信息.