m79*_*13d 4 performance matlab eval
eval并且str2func都能够评估由字符串表示的函数,fe f='a^x+exp(b)+sin(c*x)+d':
使用eval:
y = eval(f)
Run Code Online (Sandbox Code Playgroud)
或(rahnema1建议)
fHandle = eval(['@(x, a, b, c, d) ' f]);
y = fHandle(x, a, b, c, d);
Run Code Online (Sandbox Code Playgroud)使用str2func:
fHandle = str2func(['@(x, a, b, c, d) ' f]);
y = fHandle(x, a, b, c, d);
Run Code Online (Sandbox Code Playgroud)哪两种方法都具有最佳性能?
备注
请注意,此基准测试的灵感来自此问题.
简答:使用str2func.
基准
基准测试将评估N不同值的函数x.
f='a^x+exp(b)+sin(c*x)+d';
Ns = linspace(1, 1000, 20);
timeEval = zeros(size(Ns));
timeEvalHandle = zeros(size(Ns));
timeStr2func = zeros(size(Ns));
for i=1:length(Ns)
N = Ns(i);
timeEval(i) = timeit(@() useEval(f, N));
timeEvalHandle(i) = timeit(@() useEvalHandle(f, N));
timeStr2func(i) = timeit(@() useStr2func(f, N));
end
figure
plot(Ns, timeEval, 'DisplayName', 'time eval');
hold on
plot(Ns, timeEvalHandle, 'DisplayName', 'time eval');
hold on
plot(Ns, timeStr2func, 'DisplayName', 'time str2func');
legend show
xlabel('N');
figure
plot(Ns, timeEval./timeStr2func, 'DisplayName', 'time_{eval}/time_{str2func}');
hold on
plot(Ns, timeEvalHandle./timeStr2func, 'DisplayName', 'time_{eval handle}/time_{str2func}');
legend show
xlabel('N');
figure
plot(Ns, timeEvalHandle./timeStr2func);
ylabel('time_{eval handle}/time_{str2func}')
xlabel('N');
function y = useEval(f, N)
a = 1; b = 2; c = 3; d = 4;
for x=1:N
y = eval(f);
end
end
function y = useEvalHandle(f, N)
a = 1; b = 2; c = 3; d = 4;
fHandle = eval(['@(x, a, b, c, d) ' f]);
for x=1:N
y = fHandle(x, a, b, c, d);
end
end
function y = useStr2func(f, N)
a = 1; b = 2; c = 3; d = 4;
fHandle = str2func(['@(x, a, b, c, d) ' f]);
for x=1:N
y = fHandle(x, a, b, c, d);
end
end
Run Code Online (Sandbox Code Playgroud)
str2funcvs eval(没有函数句柄):结果表明,即使对函数进行一次评估,它的使用速度str2func比eval(没有函数句柄)快约50%.对于大量评估,str2func可能快约100倍(取决于您正在评估的功能).
str2funcvs eval(带有函数句柄): eval比str2func单个评估慢大约100%,但对于大量评估变得几乎同样快(eval慢约5%).
eval有和没有函数句柄:请注意,对于单个评估,创建函数句柄eval比直接评估它慢约50%.
结论: str2func总是快于eval.
| 归档时间: |
|
| 查看次数: |
247 次 |
| 最近记录: |