2013-04-10 15 views
5

{}のRコードは、一般的に、()のコードよりも高速ですか?`{}`の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() 
+0

64ビットLinuxでR-2.15.2を使用しているのは私のためのものではありません。 'sessionInfo()'からの出力を提供してください。 –

+5

[Radford Nealのブログ](http://radfordneal.wordpress.com/2010/08/15/two-surpising-things-about-r/) – baptiste

+1

を確認してください。上記で特定された相違点(私はBTWを再現することはできません)は、あなたがどのようにタスクにアプローチするかに目に見える違いをもたらします。 – Chase

答えて

9

バティストはすでにコメントでラドフォードニールのブログをリンク。
しかし、SEの人々は、外部サイトへのリンクが好きではないから、私は(33コメント)著者自身の興味深いコメントを引用してみましょう:

はい、括弧はまだR 2.13で波括弧よりも遅いです。 1、そして最新のR 2.14.1では、これまでの数多くではありませんでした(組み込み関数の一般的なオーバーヘッドを減らすために提案したパッチは、この違いを減らした後のリリースでは取り入れられました)。

括弧が遅くなる理由はありません。私はカッコを高速化する別の変更を(コードのほんの数行に)提案しました。 Luke Tierneyは、のかっこがsqrtのような演算子であり、したがって、sqrtのような演算子がどのように実装されているかを説明するコードには何もないはずではないという根拠に基づいて、 。 { }は言語構造である一方、
- 非常に基本的に何もしない関数のような - ()はオペレータのように見える、ということを知っ


括弧()には、実際には必要のないすべての演算子に共通のオーバーヘッドコードが組み込まれています。

+0

この回答は間違っています: '{' *最近のRの演算子であり、言語構造ではありません!しかし、コメント(とこの答え)が書かれて以来、これが変更された可能性があります。 –

5

ルーカスは質問にうまく答えましたが、興味のある人のオーバーヘッドのタイミングがあります(コードをベクトル化することで効果的に削除できます)。

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ミリ秒です。

関連する問題