Aşağıdaki fonksiyonu şu vektörler için örneğinif/C++ yazmadan ifelse() hızlandırmak?
getScore <- function(history, similarities) {
nh<-ifelse(similarities<0, 6-history,history)
x <- nh*abs(similarities)
contados <- !is.na(history)
x2 <- sum(x, na.rm=TRUE)/sum(abs(similarities[contados]),na.rm=TRUE)
x2
}
sonuçlarını almak gerekir:
bir döngü içinde değişirnotes <- c(1:5, NA)
history <- sample(notes, 1000000, replace=T)
similarities <- runif(1000000, -1,1)
. Bu alır:
ptm <- proc.time()
for (i in (1:10)) getScore(history, similarities)
proc.time() - ptm
user system elapsed
3.71 1.11 4.67
Başlangıçta Sorunun
for
döngü olduğundan şüpheleniyorsanız, ama
ifelse()
için sonuç noktaları profilleme.
Rprof("foo.out")
for (i in (1:10)) getScore(history, similarities)
Rprof(NULL)
summaryRprof("foo.out")
$by.self
self.time self.pct total.time total.pct
"ifelse" 2.96 65.78 3.48 77.33
"-" 0.24 5.33 0.24 5.33
"getScore" 0.22 4.89 4.50 100.00
"<" 0.22 4.89 0.22 4.89
"*" 0.22 4.89 0.22 4.89
"abs" 0.22 4.89 0.22 4.89
"sum" 0.22 4.89 0.22 4.89
"is.na" 0.12 2.67 0.12 2.67
"!" 0.08 1.78 0.08 1.78
$by.total
total.time total.pct self.time self.pct
"getScore" 4.50 100.00 0.22 4.89
"ifelse" 3.48 77.33 2.96 65.78
"-" 0.24 5.33 0.24 5.33
"<" 0.22 4.89 0.22 4.89
"*" 0.22 4.89 0.22 4.89
"abs" 0.22 4.89 0.22 4.89
"sum" 0.22 4.89 0.22 4.89
"is.na" 0.12 2.67 0.12 2.67
"!" 0.08 1.78 0.08 1.78
$sample.interval
[1] 0.02
$sampling.time
[1] 4.5
ifelse()
performansım darboğaz olduğunu. ifelse()
'u hızlandırmak için R'de bir yol bulunmadıkça, büyük bir performans artışı olasılığı yoktur.
Ancak ifelse()
zaten vectorized yaklaşımdır. Bana kalan tek şansın C/C++ kullanmak olduğunu düşünüyorum. Ama derlenmiş kodu kullanmaktan kaçınmanın bir yolu var mı?
Yalnızca zaten çalışan kodları optimize etmek istiyorsanız, bu bir StackReverlight sorusu değil CodeReview sorusudur. http://codereview.stackexchange.com/ –