trzeba uzyskać wyniki następujących funkcjiPrzyspieszenie ifelse() bez pisania C/C++?
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
}
Na przykład dla następujących wektorów:
notes <- c(1:5, NA)
history <- sample(notes, 1000000, replace=T)
similarities <- runif(1000000, -1,1)
że zmiany wewnątrz pętli. Trwa to:
ptm <- proc.time()
for (i in (1:10)) getScore(history, similarities)
proc.time() - ptm
user system elapsed
3.71 1.11 4.67
Początkowo Podejrzewam, że problem jest pętla for
, ale profilowanie punktów wynikowych do ifelse()
.
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()
to moje wąskie gardło wydajności. O ile w R nie ma sposobu na przyspieszenie ifelse()
, jest mało prawdopodobne, aby osiągnął on świetne wyniki.
Jednak ifelse()
jest już wektoryzacji. Wydaje mi się, że jedyną szansą jest użycie C/C++. Ale czy istnieje sposób na uniknięcie używania skompilowanego kodu?
Jeśli chcesz tylko zoptymalizować kod, który już działa, to jest pytanie CodeReview, a nie pytanie StackOverflow. http://codereview.stackexchange.com/ –