Ho bisogno di ottenere i risultati della seguente funzioneAccelerare ifelse() senza scrivere 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
}
Per esempio, per i seguenti vettori:
notes <- c(1:5, NA)
history <- sample(notes, 1000000, replace=T)
similarities <- runif(1000000, -1,1)
che i cambiamenti all'interno di un ciclo. Questo richiede:
ptm <- proc.time()
for (i in (1:10)) getScore(history, similarities)
proc.time() - ptm
user system elapsed
3.71 1.11 4.67
Inizialmente ho il sospetto che il problema è il ciclo for
, ma profiling Risultato Punti di 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()
è il collo di bottiglia delle mie prestazioni. A meno che non ci sia un modo in R per accelerare ifelse()
, è improbabile che ci sia un grande incremento delle prestazioni.
Tuttavia, ifelse()
è già l'approccio vettoriale. Mi sembra che l'unica possibilità rimasta è quella di usare C/C++. Ma c'è un modo per evitare l'uso di codice compilato?
Se stai solo cercando di ottimizzare il codice che funziona già, questa è una domanda CodeReview e non una domanda StackOverflow. http://codereview.stackexchange.com/ –