2014-10-05 45 views
2

我在寫一個用戶定義函數,它接受10個參數和2個數據向量。 2個數據向量可以變得非常大(10K +數據點),並且該函數執行了大量的數學計算,並且需要經常查找傳遞給該函數的參數的值。 它確實使我的代碼速度方面的任何差異是否我寫:R中用戶定義函數的性能

my.intensity=function(params, eval.times, event.times) {

s<-sort(eval.times)

t<-sort(event.times)

par1<-params[1]

par2<-params[2]

par3<-params[3]

...

par10<-params[10]

然後用par1par2,...,par10在我的功能還是我只是用params[1] params[2] params[3] ... params[10],使得功能查找的每次值?

+0

你試過'system.time()'嗎?有10個參數比讓函數每次查看值可能更快。但是在那個時候,你可能需要考慮回去編輯你的代碼是多麼容易,相比之下,這可能會帶來一些非實質性的時間收益。 – 2014-10-05 21:55:24

回答

2

簡答:收益微不足道。用編程方式更有意義。更可能的是,您需要將10個參數組合在一起,以便更方便地調用和操作。

從這個測試中,它看起來像有10個參數稍快。在這種簡單的情況下,增益實際上只是很小的(〜2%),所以只要你的功能沒有寫得很糟糕,你就不用擔心它。

myfun1 <- function(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) { 
    a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10 
} 

myfun2 <- function(a) { 
    a[1] + a[2] + a[3] + a[4] + a[5] + a[6] + a[7] + a[8] + a[9] + a[10] 
} 

x1 <- as.list(rnorm(10)) 
x2 <- list(rnorm(10)) 

> system.time(for (i in seq_len(1e6)) do.call(myfun1, x1)) 
    user system elapsed 
    5.97 0.00 6.00 
> system.time(for (i in seq_len(1e6)) do.call(myfun2, x2)) 
    user system elapsed 
    6.11 0.00 6.11 

通常,查找變量比查找索引更快。由於這是一項非常基本的操作,並且獲得的收益幾乎微不足道,但由於複雜的操作,收益將無法衡量。

+0

+1,但讓我們把這些結果放到他們的上下文中。你的函數除了一個微不足道的操作外別無它物,你幾乎看不出有什麼不同:每個函數調用在6微秒中0.11微秒! OP說他的功能做了很多數學計算。所以OP在尋找的答案是「不,沒有顯着差異」。順便說一下,你沒有測試OP描述的內容。但我認爲結果是一樣的,沒有顯着差異。 – flodel 2014-10-05 23:11:10

+0

我認爲我的分析測試後解釋得足夠。沒有他的用例,我們無法確定。查找似乎是一個加法函數的2%,所以除非該函數的設計非常可怕(嵌套循環,在最小循環中通過索引引用相同的值),所以加速是微不足道的。 – 2014-10-05 23:32:17

+0

「你可能不需要」,「我們不可能知道」,「爲自己測試」,「我們無法確定」......你可能會更有說服力! – flodel 2014-10-05 23:38:17