Я уже некоторое время изучаю R, и натолкнулся на множество советов по программированию, типа себя, для векторизации операций. Будучи программистом, мне интересно, почему и как это происходит быстрее. Пример:Почему ускорение векторизации
n = 10^7
# populate with random nos
v=runif(n)
system.time({vv<-v*v; m<-mean(vv)}); m
system.time({for(i in 1:length(v)) { vv[i]<-v[i]*v[i] }; m<-mean(vv)}); m
Это дало
user system elapsed
0.04 0.01 0.07
[1] 0.3332091
user system elapsed
36.68 0.02 36.69
[1] 0.3332091
Наиболее очевидная вещь, чтобы рассмотреть, что мы бежим машинный код, т.е. машинный код скомпилирован с C или C++, а не интерпретировать код, как показано на рисунке благодаря большой разнице в времени пользователя между двумя примерами (примерно на 3 порядка). Но есть ли что-нибудь еще? Например, делает ли R:
Хитроумные структуры данных, например. умные способы хранения разреженных векторов или матриц, чтобы мы только умножали, когда нам нужно?
ленивая оценка, например. на матрице умножить, не оценивайте ячейки до тех пор, пока вам и когда вам нужно.
Параллельная обработка.
Что-то еще.
Для того, чтобы проверить, есть ли могут быть некоторые редкие оптимизации вектор я пытался делать точечные продукты с векторными содержание разница
# populate with random nos
v<-runif(n)
system.time({m<-v%*%v/n}); m
# populate with runs of 1 followed by 99 0s
v <-rep(rep(c(1,rep(0,99)),n/100))
system.time({m<-v%*%v/n}); m
# populate with 0s
v <-rep(0,n)
system.time({m<-v%*%v/n}); m
Однако не было никакой существенной разницы во времени (около 0,09 истекшего)
(Аналогичный вопрос для Matlab: Why does vectorized code run faster than for loops in MATLAB?)
Спасибо, я не совсем понял, что вы подразумеваете под функциями в цикле, вы могли бы предоставить простой пример или ссылку (мне в целом интересно, как функциональная сторона R влияет на вещи с точки зрения пользователя view - пока все, что я сделал, было довольно процедурным по стилю). – TooTone
@TooTone 'x <- 1:10; tracemem (х); x [5] <- 1' был бы, наверное, самым простым примером. – joran
Это тонкое. Я понятия не имел, что происходит (есть дискуссионная тема) (http://r.789695.n4.nabble.com/Why-is-vector-assignment-in-R-recreates-the-entire-vector- td2403402.html), в котором отмечается, что R в основном оптимизирует эти копии, если кто-то еще захочет изучить это дальше). Я провел некоторое тестирование, и в моем коде с циклом 'for',' vv' копируется один раз, когда 'i == 1', но это не влияет на производительность. – TooTone