以下の例の R コードは{}
、一般に を使用したコードよりも高速なのはなぜ()
ですか?
n=10000000
w1=numeric(n)
w2=numeric(n)
r=rnorm(n)
t1=Sys.time()
for(i in 1:n)
w1[i]=((r[i]^2))*(1*1)
t1-Sys.time()
t1=Sys.time()
for(i in 1:n)
w2[i]={{r[i]^2}}*{1*1}
t1-Sys.time()
以下の例の R コードは{}
、一般に を使用したコードよりも高速なのはなぜ()
ですか?
n=10000000
w1=numeric(n)
w2=numeric(n)
r=rnorm(n)
t1=Sys.time()
for(i in 1:n)
w1[i]=((r[i]^2))*(1*1)
t1-Sys.time()
t1=Sys.time()
for(i in 1:n)
w2[i]={{r[i]^2}}*{1*1}
t1-Sys.time()
Lukas は質問にうまく答えましたが、関心のある人のためにオーバーヘッドのタイミングをいくつか示します (これは、コードをベクトル化することで効果的に取り除くことができます)。
brace <- function(n){
w1=numeric(n)
w2=numeric(n)
r=rnorm(n)
for(i in 1:n)
w1[i]=((r[i]^2))*(1*1)
}
curly <- function(n){
w1=numeric(n)
w2=numeric(n)
r=rnorm(n)
for(i in 1:n)
w2[i]={{r[i]^2}}*{1*1}
}
microbenchmark( curly(1e5) , brace(1e5) , times = 50 )
Unit: milliseconds
expr min lq median uq max neval
curly(1e+05) 311.4245 318.8916 324.1990 335.0928 400.8555 50
brace(1e+05) 315.5428 323.8860 328.7982 350.7268 406.5785 50
1e5 ループ長で約 5 ミリ秒の差。それでは、ループを削除しましょう。
braceV <- function(n){
w1=numeric(n)
w2=numeric(n)
r=rnorm(n)
w1=((r^2))*(1*1)
}
curlyV <- function(n){
w1=numeric(n)
w2=numeric(n)
r=rnorm(n)
w2={{r^2}}*{1*1}
}
microbenchmark( curlyV(1e5) , braceV(1e5) , times = 50 )
Unit: milliseconds
expr min lq median uq max neval
curlyV(1e+05) 9.014361 9.284532 9.666867 10.81317 37.82510 50
braceV(1e+05) 9.029408 9.373773 10.293302 10.83487 37.76596 50
差は約 0.5 ミリ秒になりました。