मैं निम्नलिखित समारोहसी/सी ++ लिखने के बिना ifelse() को तेज करना?
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
}
निम्नलिखित वैक्टर के लिए
उदाहरण के लिए के परिणाम प्राप्त करने की आवश्यकता:
notes <- c(1:5, NA)
history <- sample(notes, 1000000, replace=T)
similarities <- runif(1000000, -1,1)
यह एक पाश के अंदर बदल जाता है। यह लेता है:
ptm <- proc.time()
for (i in (1:10)) getScore(history, similarities)
proc.time() - ptm
user system elapsed
3.71 1.11 4.67
शुरू में मुझे लगता है कि समस्या for
पाश है, लेकिन 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()
मेरा प्रदर्शन बाधा है। जब तक ifelse()
को गति देने के लिए आर में कोई रास्ता नहीं है, तो शानदार प्रदर्शन बढ़ाने की संभावना नहीं है।
हालांकि, ifelse()
पहले ही वेक्टरीकृत दृष्टिकोण है। ऐसा लगता है कि सी/सी ++ का उपयोग करने का एकमात्र मौका है। लेकिन संकलित कोड का उपयोग करने से बचने का कोई तरीका है?
यदि आप केवल कोड को अनुकूलित करने के लिए देख रहे हैं जो पहले से ही काम करता है तो यह एक कोड रिव्यू प्रश्न है जो स्टैक ओवरफ़्लो प्रश्न नहीं है। http://codereview.stackexchange.com/ –