Matlab傳值調用會導致效率低多少?
01-08
Matlab的函數好像是傳值調用而非傳引用調用,意味著每次調用函數都要重新把變數在內存里複製一遍,這種拷貝對效率有多大的損失?特別是在數據量大的時候。相比之下Python和Julia是不是設計更合理一點?
Matlab 只有在輸入參數被修改時才會被複制,此時相當於傳值;否則相當於傳引用。
來源
Does MATLAB pass parameters using "call by value" or "call by reference"?
更正一下題主問題中的兩個錯誤:
1. Matlab也可以使用傳引用調用,參見Abstract class for deriving handle classes
2. 即便是傳值調用,也不意味著每次調用函數都要重新把變數在內存里複製一遍。實際上Matlab有其內部的內存管理機制:如果一個函數在內部不修改傳進來的矩陣,則複製矩陣並不會發生;只有在函數內部對傳進來的矩陣進行修改時,才會發生複製的動作。MatLab我不熟悉,只來說一下Python的情況
Numpy裡面默認從不進行值的複製操作,對np.array和np.matrix的索引操作只會返回視圖,任何對索引後的結果的修改都會影響原數組,當需要copy的時候,可以手工調用np.copyPandas的索引操作會返回副本,但是如果把pd.DataFrame對象當作參數傳入的時候,也是傳遞引用的我一直用這兩個庫工作,沒有感覺到效率壓力
做一個拍腦袋的估計,我覺得MatLab因為按值傳遞造成的效率損失大概會增加30%-40%的運行時間之前做一個big data上的演算法,因為matlab做些預處理數據很方便,所以一開始就用matlab。後來發現優化部分gradient descent很慢。於是我就把這部分部分剝離出來用c寫,用mex編譯後,回matlab里調用。
結果問題就來了,速度比原來還慢!原因就是題主說的傳值。
因為每一輪循環中,在matlab 去調用那個mex時, 都要把那個100MB的矩陣複製一遍傳到c里。。。這個主要看你傳遞的變數的size有多大。
推薦閱讀: