저는 지금 당장 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은 다음을 수행합니다.
교묘 한 네이티브 데이터 구조. 희소 한 벡터 또는 행렬을 저장하는 영리한 방법을 사용하여 필요시 곱셈 만 수행 할 수 있습니까?
지연 평가. 행렬 곱셈에서 필요할 때까지 셀을 평가하지 마십시오.
병렬 처리.
다른 것.
내가
(경과 0.09 년경)
# 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
그러나 시간에 유의 한 차이가 없었다 차이 벡터 내용으로 내적을하고 시도 약간의 스파 스 벡터 최적화가있을 수 있습니다 여부를 테스트하려면 (Matlab에 대한 비슷한 질문 :
Why does vectorized code run faster than for loops in MATLAB?)
감사합니다. 저는 루프에서 함수가 의미하는 바를 따르지 않았습니다. 간단한 예제 나 참조를 제공 할 수 있습니까? (일반적으로 R의 기능적 측면이 사용자의 요점 보기 - 지금까지 내가 한 모든 일은 꽤 절차 적이었다.) – TooTone
@TooTone'x <- 1:10; tracemem (x); 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