Rcpp ile R Kodunu Optimize Etme
Romain François
Consulting Datactive, ThinkR
R
C++
max'in döngülü sürümü
slowmax <- function(x){
res <- x[1]
for ( i in 2:length(x) ){
if( x[i] > res ) res <- x[i]}
res }
microbenchmark ile performans karşılaştırması
library(microbenchmark)
x <- rnorm(1e6)
microbenchmark( slowmax(x), max(x) )
Birim: milisaniye
expr min lq mean median uq max neval
slowmax(x) 31.649452 34.29454 36.344912 35.435299 37.188249 90.363038 100
max(x) 1.563559 1.74036 1.939367 1.847045 2.014684 3.340052 100
library(Rcpp)
evalCpp( "40 + 2" )
42
evalCpp( "exp(1.0)" )
2.718282
evalCpp( "sqrt(4.0)" )
2
Kullanarak
std::numeric_limits<int>::max()
en büyük temsil edilebilir 32 bit işaretli tamsayıyı (int) almak
evalCpp(
"std::numeric_limits<int>::max()"
)
2147483647
( $\footnotesize \mathtt{2147483647 = 2^{31}-1}$)
C++ zengin sayı türlerine sahiptir
intdoubleR
# Sayı sabitleri double'dır
x <- 42
storage.mode(x)
"double"
# Tamsayılar L soneki ister y <- 42L storage.mode(y)z <- as.integer(42) storage.mode(z)
"integer"
"integer"
C++
# .0 soneki double zorlar
y <- evalCpp( "42.0" )
storage.mode(y)
"double"
library(Rcpp)
# Sayı sabiti tamsayılar int'tir
x <- evalCpp( "42" )
storage.mode(x)
"integer"
(double) ile açık dönüşüm
# Açık dönüşüm
y <- evalCpp("(double)(40 + 2)")
storage.mode(y)
"double"
Tamsayı bölmesine dikkat et
# Tamsayı bölmesi
evalCpp( "13 / 4" )
3
# Açık dönüşüm ve bu yüzden
# double bölme kullanımı
evalCpp( "(double)13 / 4" )
3.25
# R'de otomatik dönüştürme
13L / 4L
3.25
Rcpp ile R Kodunu Optimize Etme