tôi cần để có được những kết quả của hàm sauTăng tốc ifelse() mà không cần viết 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
}
Ví dụ cho các vectơ sau:
notes <- c(1:5, NA)
history <- sample(notes, 1000000, replace=T)
similarities <- runif(1000000, -1,1)
Đó thay đổi bên trong một vòng lặp. Này có:
ptm <- proc.time()
for (i in (1:10)) getScore(history, similarities)
proc.time() - ptm
user system elapsed
3.71 1.11 4.67
Ban đầu tôi nghi ngờ rằng vấn đề là for
vòng lặp, nhưng profiling điểm kết quả để 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()
là nút cổ chai hiệu suất của tôi. Trừ khi có một cách trong R để tăng tốc độ ifelse()
, không có khả năng tăng hiệu suất tuyệt vời.
Tuy nhiên, ifelse()
đã là phương pháp được vector hóa. Dường như với tôi rằng cơ hội duy nhất còn lại là sử dụng C/C++. Nhưng có cách nào để tránh sử dụng mã được biên dịch không?
Nếu bạn chỉ đang tìm cách tối ưu hóa mã đã hoạt động thì đây là câu hỏi CodeReview không phải là câu hỏi StackOverflow. http://codereview.stackexchange.com/ –