R vectorization을 해야 하는 이유.

어제 The Art of R Programming 책을 보다가 2.13에서 포함된 바이트 컴파일러 패키지 예제를 보고 몇 가지 코드를 올려본다.

크게 3가지 코드가 있는데, 테스트는 10000000의 데이터를 가진 벡터끼리의 곱 연산 속도 비교를 for문 기반, 바이트 컴파일 된 함수 기반,vectorization 기반 이렇게 세가지 방법으로 돌려봤다.

결과는 바이트 컴파일 된 함수가 for으로 돌린 컴파일되지 않은 코드보다 3배 이상 빨랐고, 벡터화 된 코드는 컴파일 된 for문 코드보다  212배 빨랐다.

2.13.2에 새로 포함된 바이트 컴파일러 패키지 사용이 코드 속도 향상에 도움이 되긴 하지만 역시나 vectorization 기반의 코드 작성이 훨씬 많은 성능향상을 가져온다는 것을 알 수 있다.

for문을 쓰지 않고 얻을 수 있는 최적화의 정도가 너무 크니 앞으로 for문 사용을 최대한 자제하는 게 나을 듯 하다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
library(compiler)
x <- rnorm(10000000)
y <- rnorm(10000000)
z <- vector(mode="numeric",length=10000000)
system.time(z <- x * y)
 
test1 <- function(){
  for(i in 1:10000000)
    z[i] <<- x[i] * y[i]
}
 
system.time(test1())
#    user  system elapsed 
#  39.551   0.094  39.651
 
comp_test1 <- cmpfun(test1)
system.time(comp_test1())
#    user  system elapsed 
#  11.831   0.066  11.898 
 
system.time(z <- x * y)
#    user  system elapsed 
#   0.034   0.022   0.056

CC BY-NC 4.0 R vectorization을 해야 하는 이유. by from __future__ import dream is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.