標籤:

4種執行函數方法的速度大PK

4種執行函數方法的速度大PK

來自專欄 MATLAB

fun = round;x1 = pi;%%disp(直接調用函數:)tic;for ii = 1:1e3 y = round(x1);endt1 = toc;t1/t1%%disp(匿名函數(加入名義變數):);f = @(x) round(x);tic;for ii = 1:1e3 y = f(x1);endt2 = toc;t2/t1disp(匿名函數(不加名義變數):);f = @round;tic;for ii = 1:1e3 y = f(x1);endt22 = toc;t22/t1%%disp(feval:)tic;for ii = 1:1e3 y = feval(fun,x1);endt3 = toc;t3/t1%%disp(eval:);tic;for ii = 1:1e3 eval(sprintf(y = %s(%f);, fun, x1));endt4 = toc;t4/t1

結果:

直接調用函數:ans = 1匿名函數(加入名義變數):ans = 2.7234匿名函數(不加名義變數):ans = 15.1915feval:ans = 171.8809eval:ans = 575.8681

總結:

測試了4種常見的執行函數的方法.

第一種, 直接調用函數, 這恐怕是最常用的方法了(可能有超過一半的用戶只知道這一種).

發現這種方法速度是最快的.

第二種, 匿名函數, 這個方法第二快. 其中加入名義變數要比不加入名義變數要快.

第三種, 通過feval執行, 這個方法是第三快的.

第四種, 通過eval執行, 這個方法是最慢的.

我們發現, 這四種速度是越來越慢的, 但是使用靈活性是越來越高的.

因此, 用戶可以根據自己的需要選擇合適的方法.

隨機測試了幾個函數, 這些方法具體速度倍數有差別, 但是名次不變, 都是越來越慢的.

如果讀者發現有例外的, 可以在評論區裡面留言.

感謝 @Falccm 的建議.

在原有的文章的基礎上:

1 增加了帶有名義變數匿名函數的測試

2 腳本運行多次, 直接調用函數法的優勢更大了. 原因是: 函數第一次運行時, 比較慢, 第二次或以上, 就開始JIT了, 會提速.

----更新-----------------------------------------------------------------------------------

沒想到很快利用了這種加速技巧.

最近加速了一個第三方庫.

裡面大量的使用的匿名函數和feval.

更誇張的是: 匿名函數套匿名函數, 最多套了5層!

我將這些匿名函數和feval都改成了普通函數.

雖然花了不少時間(周末兩天, 主要是代碼量挺大的, 而且嵌套層數比較多), 改完了以後, 速度是原先的2倍左右.


推薦閱讀:

Matlab2012a(32/64位)
APPs(004)Matlab出圖真的丑嗎?(b)
matlab調用python整理(2):一些數據類型轉換
為什麼說 MATLAB 快?
為什麼我不回答你的MATLAB提問?

TAG:MATLAB |