어제 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 |
R vectorization을 해야 하는 이유. by from __future__ import dream is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.