2013-02-20 82 views
0

您好我剛剛有一個關於使用多個函數編寫更快的R腳本的快速問題: 假設每個示例中的內容完全相同,以下哪一項運行得更快? 函數中的功能即是通過東西彼此之外編寫R代碼的最佳做法

function(args) 
{ 
function_using_previous_function_output(args) 
{ manipulation of arguments} 

} 

功能:

function(args) 
{return(output} 
} 

function_using_previous_function_output(output) 
{ 
manipulation of arguments 
} 

是否有風格或優化了它們的最佳實踐?

非常感謝!

+2

我不認爲你會看到很多速度差異,但爲什麼不用'microbenchmark'或類似方法測試它? – 2013-02-20 14:44:20

回答

5

簡答題;你正在優化代碼方面看錯了方向。

長答案;

內容幾乎總是腳本性能的最重要方面。如果你的代碼已經並行化,矢量化,Rcpp-ised和字節編譯(需要(編譯器); enableJIT(3)),那麼你應該只是真的在欺騙你的語法,而且你還需要更多的速度。

在您需要更改代碼本身的形狀來獲得速度不太可能的情況下,這些文章是你的朋友

http://www.r-bloggers.com/speeding-up-r-computations/ http://radfordneal.wordpress.com/2010/08/15/two-surpising-things-about-r/

要回答你原來的問題;你應該使用system.time()函數來確定效率;我懷疑無論哪種方式都會有統計學上的顯着差異

+0

爲什麼enableJIT(3)在第一次輸入時返回0,第二次返回3? – vitor 2013-12-28 17:50:52

3

我一直在編寫一個模擬軟件包,它使用許多功能根據生物模型的不同過程執行不同的步驟。然後,這些函數本身被主函數調用,它通過調用它們進行模擬,偶爾使用這些子函數的輸出自己做一些東西。重點在於它嚴重依賴於函數的功能;當我在我的主要模擬功能中執行了一系列步驟時,我看不出很大的速度差異 - 然後整理它,然後將這些步驟放到子功能中。但是我更喜歡這樣做,因爲當每個子函數結束時,子函數期間使用的任何變量或垃圾,但實際上並未用於任何結果或return()'d在子函數結束時被刪除,這意味着當出現意外修改變量時你不想。通常我在R中看到的主要速度差異是在你進行循環操作並向量化它或使用Rcpp在C++中完成時發生的。無論如何,R中的大多數核心內容都很快,並且已經進行字節編譯。

+0

+1使用許多功能。使用函數的層次結構(例如,一個函數讀取文件,第二個讀取使用前一個函數的文件的目錄)使得更容易理解代碼,並且使得重用代碼更容易,即,從這些小型積木創建新的功能。 – 2013-02-20 22:33:32