1樓:王贇 Maigo
試驗了一下多種寫法的速度,從慢到快排列。
A為7777階隨機方陣,時間為100次執行平均用時,所用Matlab版本為R2013a。
sum(sum(A.^2)):0.
273 ssum(A(:).^2):
0.272 s,跟前一種其實沒有區別dot(A(:), A(:
)):0.251 s,跟前一種也幾乎沒有區別
題主的loop2:0.160 s
題主的loop1:0.100 s
A(:)' * A(:):0.031 s,明顯比其它寫法快
2樓:
mma:In[
1]:=A
=RandomReal[1
,];Total[A
^2,2
]//AbsoluteTiming#.
#&@Flatten@A
//AbsoluteTiming
Out[2]
=Out[3]=
3樓:Colliot
用 Julia 跑的結果:
function
test()A
=rand
(7777
,7777
);@time
bench_loop1(A
)@time
bench_loop2(A
)@time
bench_sum(A
)@time
bench_vec(A
)end
function
bench_loop1(A
)v=0
~,N=
size(A
)foriin
1:Nv
=v+A
[:,i
].^2ends=
sum(v)
return
send
function
bench_loop2(A
)s=0
~,N=
size(A
)foriin
1:Ns
=s+sum(A
[:,i
].^2)
endreturn
send
function
bench_sum(A
)s=sum
(sum(A
.^2))return
send
function
bench_vec(A
)returnA[
:]'*A
[:]end
test
()在 Win10 x64, julia 0.4.6, i5-4200H 2.8GHz, 12 GB 上是
2.136738 seconds (92.30 k allocations: 1.354 GB, 17.70% gc time)
1.626556 seconds (76.75 k allocations: 924.642 MB, 5.60% gc time)
1.435639 seconds (4 allocations: 461.439 MB, 0.09% gc time)
0.836528 seconds (6 allocations: 922.
878 MB, 2.27% gc time在 OS X 10.11.
1, julia 0.4.6, i5-4258U 2.
4GHz, 16 GB 上是
2.418516 seconds (92.30 k allocations: 1.354 GB, 14.08% gc time)
1.976998 seconds (76.75 k allocations: 924.642 MB, 2.65% gc time)
2.168147 seconds (4 allocations: 461.439 MB, 0.02% gc time)
0.688714 seconds (6 allocations: 922.878 MB, 0.89% gc time)
同一臺 Windows 機器上跑 MATLAB R2015a 的結果(最後是 A(:)'*A(:)):
Loop1: 0.151757
Loop2: 0.235973
Direct: 0.392878
Vectorized: 0.048278最後乙個快得很顯著。
4樓:Shan He
第二種比第一種快的原因應該是涉及到matlab的矩陣儲存方式問題導致的定址問題,第一種方式每一行都是在記憶體中連續一段記憶體,而第二種方式不同每次乙個取的向量A(:,i)中的每個數值在原始記憶體中不是連續的,需要每次定址;
5樓:
你問兩種迴圈方法差距為什麼那麼大我不知道
但是我知道你的向量化方法有問題:
A=rand(7777);
ticv=0;
[~,N]=size(A);
for i=1:N
v=v+A(:,i).^2;
ends=sum(v);
toctic
b=sum(sum(A.^2));
toctic
c=A(:)'*A(:);
tocElapsed time is 0.036093 seconds.
Elapsed time is 0.132542 seconds.
Elapsed time is 0.021972 seconds.
明顯還是向量化快嘛
6樓:楊燕寧
原因前面的人都說了,bench_loop1不需要用乙個臨時變數儲存A(:,i).^2的結果,而bench_loop2需要。
@Falccm的答案中指出,A(:,:)這樣的索引會複製A中所有資料。
而A(:)是不複製的,即資料是共享的。這一點我在另乙個問題中提到過。
此外,MATLAB優化最好的運算(之一)——矩陣乘法——是值得信賴的。所以,
s = A(:).' * A(:);
7樓:路強
我同意立黨的說法,覺得本質上還是在迴圈體裡進行函式呼叫會涉及到引數記憶體空間的複製與銷毀,而且由於是動態型別語言,在呼叫的時候還會涉及型別檢查之類的額外開銷,所以對於效能苛刻的應用還是盡量寫簡單的函式體。
至於經cpython優化的python,基本成了強型別語言了,其迴圈是在c層次實現的,不會有型別檢查之類的開銷,至於呼叫過程是引數空間複製還是指標層面實現我拿不太準,如果是指標層面實現的那速度快也是應該的。
誅仙中所有人物,你最喜歡誰?說乙個理由
hhhhhh 道玄道玄誠然有許多不完美之處。可他在明知誅仙劍戾氣無二,親眼看到恩師入魔的情況下,兩拔誅仙劍,護正道,救蒼生。無愧青雲,無愧正道,無愧天下。 主角最喜歡鬼厲張小凡。配角最喜歡秦無炎。年紀輕輕,武功高強,出場時含笑而立,氣度儒雅,待人接物很有禮貌但不過分客套。最驚豔我的是他和法相的一段對...
預算5000 6000元,求推薦乙個遊戲電腦配置?
日心說 英雄聯盟.不是新出的,絕地求生也是了。新出的是apex英雄,鬼泣5等等。不做大專案,不開多軟體,CAD的配置要求不高。在顯示卡和CPU上,玩以上遊戲玩的倍兒爽的電腦自然帶的起CAD。我推薦一下,英特爾i5 9400f 藍寶石rx580 8G白金版,微星B360m WIND主機板,駭客神條FU...
你們說乙個人到死都充滿遺憾 生活中所有的一切處處充滿認命是不是活著還不如死了 後悔被生下來?
REWBEY 會遺憾,會後悔,只能代表你不甘心罷了。既然不甘心,要麼就放下,要麼就去爭取。什麼都不去做,卻獨自懊惱的人,才是最應該去後悔的。爭取了卻得不到,那就放下它,這也不算什麼認命,只是承認這個東西不屬於自己而已,認清現實。既然不屬於自己,那也沒有必要一直記著那些遺憾。我在意的東西不多,但是總有...