我会添加一个回答,包含我自己测试的结果,但如果其他人能够贡献他们的知识,我将不胜感激。这只是我进行的一个简单测试。
我已经使用1000的单元格大小和1000次循环测试了以下条件(总时间的结果),我可能需要运行超过1000次,因为结果有些波动,但无论如何,这不是一篇科学文章。
- 基本操作(求和)
- 简单的for循环:0.2663秒
- cellfun:9.4612秒
- 字符串操作(strcmp)
- 简单的for循环:1.3124秒
- cellfun:11.8099秒
- 内置函数(isempty)
- 简单的for循环:8.9042秒
- cellfun(字符串输入 -> 参见此参考资料):0.0105秒
- cellfun(fcn句柄输入 -> 参见此参考资料):0.9209秒
- 非均匀数据(regexp)
- 简单的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);
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;
myCell = repmat({'matchStr'},1,nCells);
myCell(1:2:end) = {'dontMatchStr'};
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;
myCell = cell(1,nCells);
myCell(1:2:end) = {0};
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;
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;
for
循环,就像你一样(或曾经一样),我的动机是为了性能。我认为(或曾经认为?)for
循环通常较慢,应该避免使用。 - Luis Mendocellfun
在特殊情况下除外,速度较慢。请参见http://www.mathworks.com/matlabcentral/answers/42335和http://www.mathworks.com/matlabcentral/newsreader/view_thread/301894。 - Luis Mendocellfun
通常比for
循环慢...这会让我为了无用的努力感到无聊。感谢您提供的参考资料。 - Wernercellfun
和arrayfun
,而我正在逐渐掌握它们的用法... - Luis Mendo