2017-09-14 6 views
1

の少ない数は、私はRのコードについて質問がある場合。数行のコードに渡ってステートメントを書くと、1行でステートメントを実行することもできますが、コードは高速です。だから、行数が少ないほど実行は速いのですか?より高速なRコード行

例:

fileName = paste(directory, "fileTest.csv", sep="") 
vars = read.csv(fileName, header=F) 
vars = as.matrix(vars) 

または

vars = as.matrix(read.csv(paste(directory, "fileTest.csv", sep=""), header=F)) 
私は一度だけそれは問題ではないことを想像することができます

が、これはあなたのコード内で大量に発生した場合は?

+1

わからない、あなただけの1(第2の変数)を作成するよりも悪化している2つの変数を割り当てます。私はそれが常にパフォーマンスと可読性の間の貿易だと思う。あなたが考慮したいと思うかもしれ –

+1

別のオプションは、中間体なしで、あなたにコードを読みやすさを追加することができます '%>%'と配管です。 –

+0

'microbenchmark :: microbenchmark'でテストできます。それは任意の本当の違いを疑う - 可読性が、私はほとんどの時間は、読み出し動作に行くことを期待するあなたの例では –

答えて

8

のは、3つの機能を比較してみましょう:3行を持つ関数、1本のラインと機能とのパイプを使用する関数を。

library(microbenchmark) 
library(dplyr) 
library(ggplot2) 

directory <- getwd() 
mat <- matrix(rnorm(n=20000),nrow=200) 
write.table(mat,"matrix.txt",sep="\t") 

# 3-line code 
fn1 <- function() 
{ 
    fileName = paste0(directory,"/matrix.txt") 
    vars = read.delim(fileName,header=T) 
    as.matrix(vars) 
} 

# 1-line code 
fn2 <- function() 
{ 
    as.matrix(read.delim(paste0(directory,"/matrix.txt"),header=T)) 
} 

# using pipe 
fn3 <- function() 
{ 
    paste0(directory,"/matrix.txt") %>% 
      read.delim(.,header=T) %>% 
      as.matrix() 
} 

ここで、各機能を1000回実行し、ランタイムを測定します。結果をプロットする。

mb <- microbenchmark::microbenchmark(fn1(),fn2(),fn3(),times=1000) 
ggplot2::autoplot(mb) 

enter image description here

私は速度の差が有意であるとは思いません。しかし、私の意見では、他の仲介変数を作成することによって使用されるメモリ量などの要因(コメントで述べたように)、コードの読みやすさなど

は、読みやすくするための余分な行を使用することをお勧めしますがあります。これにより、後でコードを編集/変更することが容易になります。時々、中間変数を持つことは、デバッグに役立つことがあります。多くのことが起こっている場合は、不要になった変数を削除することをお勧めします。速度に関するしかし、最初のコードで

+0

あなたの有益な答えをありがとう。はい、すべての行を1行にすると読みやすさが悪くなりますので、複数の行を使用するだけですが、中間変数を低く保ちます。 –

関連する問題