[英]What could be wrong with this matrix multiplication benchmark (Matlab vs Numpy)?
這是我編寫的用於比較numpy和Matlab性能的代碼。 它只是測量矩陣乘法(1701x576矩陣M1 * 576x576矩陣M2)所花費的平均時間。
Matlab版本 :(M1為(1701x576),而M2為(576x576)矩陣)
function r = benchmark(M1,M2)
total_time=0;
for i=1:4
for j=1:1500
tic;
a=M1*M2;
tim=toc;
total_time =total_time+tim;
end
end
avg_time = total_time/4
r=avg_time
end
Python版本 :
def benchmark():
iters = range(1500)
for i in range(4):
for j in iters:
tic = time.time()
a=M1.dot(M2);
toc = time.time() - tic
t_time=t_time+toc;
return t_time/4
Matlab版本大約需要18.2s ,而Python需要大約19.3s。 我已經多次重復了該測試,並且在所有情況下Matlab的性能始終優於Python(即使差異較小)。 我的理解是Numpy使用有效的編譯代碼進行矢量運算,並且應該比Matlab更快。
那么,為什么Matlab的性能要比Numpy更快? 該測試是在32核計算機上完成的。 我哪里做錯了 ? 或者這對於Numpy來說要比Matlab慢。
有什么方法可以提高Python的性能嗎?
編輯:更新了matlab代碼以修復循環索引/返回值錯誤。 該錯誤是由於我嘗試在發布程序中編輯快照程序中的名稱以使其可顯示而造成的(每次都不好的主意:))。
[編輯以刪除循環的提及; 那是我的錯誤]
夫妻的事
首先,機器的多核本質並不重要,除非您明確使用了這些額外的核(或將NumPy鏈接到使用多個核的BLAS庫-感謝@ali_m)。 如果不是這樣,它在32核計算機上的運行速度將與在4核計算機上的運行速度差不多(假設內核本身的時鍾速度大致相等)。
其次,使用純現成的Matlab與現成的NumPy, Matlab通常會擊敗NumPy 。 但是,這是一個非常籠統的陳述。 因人而異。 此外,談到Matlab,循環索引中確實確實存在錯誤。
第三,這可能不是最佳的性能基准; 可能會發生一些看不見的緩存問題,這些問題並不明顯。 更好的方法是在每次迭代過程中即時動態生成矩陣並將它們相乘,但是根據隨機數生成器的不同,即使這樣也會有問題。
Matlab代碼中有錯誤。 看來您在嵌套循環中使用了相同的循環控制變量。
外循環實際上只運行一次。
編輯:外循環實際上運行正確的次數。 這兩個循環控制變量似乎是獨立的。
我可以在測試中看到兩個主要問題。
第一個是您在Python中使用全局變量查找,而在MATLAB中使用局部變量查找。 Python中的全局變量查找相對較慢。 確保變量像在MATLAB中一樣是局部變量會影響性能。
第二個是您要一遍又一遍地進行相同的計算。 MATLAB有一個用於循環的JIT,而numpy有一個用於計算的緩存,這兩者都可以減少重復計算的時間。
因此,為使比較更加平等和可靠,您應該在循環中每次創建新的隨機矩陣。 這將防止緩存和JIT弄亂您的結果,並確保變量均為本地變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.