我将在我自己测试的结果中添加一个答案,但如果人们贡献他们的知识,我会很高兴,这只是我所做的一个简单测试。
我已经测试了以下条件,单元格大小为 1000 和 1000 个循环(总时间的结果,我可能必须运行超过 1000 次,因为我的结果有点波动,但无论如何,这不是一篇科学文章):
-
基本运算(总和)
- 简单的 for 循环:0.2663 秒
- cellfun:9.4612 秒
-
字符串操作(strcmp)
- 简单的 for 循环:1.3124 秒
- cellfun:11.8099 秒
-
内置(空)
-
非统一(正则表达式)
- 简单的 for 循环:24.2157 秒
- cellfun(字符串输入):44.0424 秒
因此,带有匿名函数调用的 cellfun 似乎比简单的 for 循环慢,但如果您将使用内置的 matlab 方法,请使用 cellfun 并与字符串引号一起使用。这不一定适用于所有情况,但至少适用于测试的功能。
实现的测试代码(我远不是优化专家,所以这里是代码,以防我做错了什么):
function ...
[loop_timeAdd,cellfun_timeAdd,...
loop_timeStr,cellfun_timeStr,...
loop_timeBuiltIn,cellfun_timeBuiltInStrInput,...
cellfun_timeBuiltyInFcnHandle,...
loop_timeNonUniform,cellfun_timeNonUniform] ...
= test_cellfun(nTimes,nCells)
myCell = repmat({0},1,nCells);
output = zeros(1,nCells);
% Basic operation
tic;
for k=1:nTimes
for m=1:nCells
output(m) = myCell{m} + 1;
end
end
loop_timeAdd=toc;
tic;
for k=1:nTimes
output = cellfun(@(in) in+1,myCell);
end
cellfun_timeAdd=toc;
% String operation
myCell = repmat({'matchStr'},1,nCells); % Add str that matches
myCell(1:2:end) = {'dontMatchStr'}; % Add another str that doesnt match
output = zeros(1,nCells);
tic;
for k=1:nTimes
for m=1:nCells
output(m) = strcmp(myCell{m},'matchStr');
end
end
loop_timeStr=toc;
tic;
for k=1:nTimes
output = cellfun(@(in) strcmp(in,'matchStr'),myCell);
end
cellfun_timeStr=toc;
% Builtin function (isempty)
myCell = cell(1,nCells); % Empty
myCell(1:2:end) = {0}; % not empty
output = zeros(1,nCells);
tic;
for k=1:nTimes
for m=1:nCells
output(m) = isempty(myCell{m});
end
end
loop_timeBuiltIn=toc;
tic;
for k=1:nTimes
output = cellfun(@isempty,myCell);
end
cellfun_timeBuiltyInFcnHandle=toc;
tic;
for k=1:nTimes
output = cellfun('isempty',myCell);
end
cellfun_timeBuiltInStrInput=toc;
% Builtin function (isempty)
myCell = repmat({'John'},1,nCells);
myCell(1:2:end) = {'Doe'};
output = cell(1,nCells);
tic;
for k=1:nTimes
for m=1:nCells
output{m} = regexp(myCell{m},'John','match');
end
end
loop_timeNonUniform=toc;
tic;
for k=1:nTimes
output = cellfun(@(in) regexp(in,'John','match'),myCell,...
'UniformOutput',false);
end
cellfun_timeNonUniform=toc;