我在matlab上使用for循环玩了一下,我知道通常可以避免它们,在这种情况下,速度要快得多。但如果我真的想要通过矢量V的所有元素,我做了那个小测试:
n=50000000;
V =1:n;
s1 = 0;
tic
for x=V
s1 = s1+x;
end
toc
s2 = 0;
tic
for ind=1:numel(V)
s2 = s2+V(ind);
end
toc
s1和s2相等(正常)但第一次循环需要24.63秒而第二次循环只需0.48秒。
我对这些数字感到有些惊讶。它是否已知?有人有任何解释吗?
答案 0 :(得分:4)
这可能是由内存分配引起的。案例1中的陈述,
for x=V
必须创建V
的副本。我们为什么知道?如果您在循环中V
修改了x
,则不会受到影响:它仍会运行原始的V
值。
另一方面,案例2中的陈述,
for ind=1:numel(V)
实际上并未创建向量1:numel(V)
。来自help for
,
当冒号表达式出现在for语句中时,长循环的内存效率更高,因为从不创建索引向量。
不需要分配内存的事实可能是速度增加的原因,至少部分是这样。
要对此进行测试,请将for ind=1:numel(V)
更改为for ind=[1:numel(V)]
。这将强制创建向量1:numel(V)
。然后,运行时间应该类似于案例1,或者确实稍微大一点,因为我们仍然需要使用V
索引到V(ind)
。
这些是我电脑上的运行时间:
% Case 1
n=50000000;
V =1:n;
s1 = 0;
tic
for x=V
s1 = s1+x;
end
toc
% Case 2
s2 = 0;
tic
for ind=1:numel(V)
s2 = s2+V(ind);
end
toc
% Case 3
s3 = 0;
tic
for ind=[1:numel(V)]
s3 = s3+V(ind);
end
toc
结果:
Elapsed time is 0.610825 seconds.
Elapsed time is 0.182983 seconds.
Elapsed time is 0.831321 seconds.