裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

ダメ出し:「もっといい方法があるはず」と常に考える

2012年02月14日 | ブログラミング

配列の拡張とパフォーマンス

差を強調したいがために,基本を忘れている。

> num = 50000
> ### 配列を拡張していく ###
> gc(); gc()
         used (Mb) gc trigger (Mb) max used (Mb)
Ncells 340948 18.3     597831 32.0   597831 32.0
Vcells 602119  4.6    1162592  8.9  1162586  8.9
         used (Mb) gc trigger (Mb) max used (Mb)
Ncells 340955 18.3     597831 32.0   597831 32.0
Vcells 602146  4.6    1162592  8.9  1162586  8.9
> system.time({
+     x <- numeric(0)
+     i <- 1
+     while (i <= num) {
+         x[i] <- i
+         i <- i + 1
+     }
+ })
   ユーザ   システム       経過 
     5.788      0.317      6.078
> ### 配列を一度に初期化 ###
> gc(); gc()
         used (Mb) gc trigger (Mb) max used (Mb)
Ncells 340957 18.3     597831 32.0   597831 32.0
Vcells 602140  4.6    1162592  8.9  1162592  8.9
         used (Mb) gc trigger (Mb) max used (Mb)
Ncells 340955 18.3     597831 32.0   597831 32.0
Vcells 602146  4.6    1162592  8.9  1162592  8.9
> system.time({
+     x <- numeric(num)
+     i <- 1
+     while (i <= num) {
+         x[i] <- i
+         i <- i + 1
+     }
+ })
   ユーザ   システム       経過 
     0.181      0.001      0.193

while は,初期化,判定,加算が必要なので,無駄が多い。
for の替わりに使うべきものではない。

> ### 配列を一度に初期化 ### for があるんだからfor を使う
> gc(); gc()
         used (Mb) gc trigger (Mb) max used (Mb)
Ncells 340957 18.3     597831 32.0   597831 32.0
Vcells 621526  4.8    1162592  8.9  1162592  8.9
         used (Mb) gc trigger (Mb) max used (Mb)
Ncells 340955 18.3     597831 32.0   597831 32.0
Vcells 621532  4.8    1162592  8.9  1162592  8.9
> system.time({
+     x <- numeric(num)
+    for (i in 1:num) {
+         x[i] <- i
+     }
+ })
   ユーザ   システム       経過 
     0.128      0.000      0.165

> ### 配列を一度に初期化 ### for,  seq.int を使う
> gc(); gc()
         used (Mb) gc trigger (Mb) max used (Mb)
Ncells 340957 18.3     597831 32.0   597831 32.0
Vcells 621526  4.8    1162592  8.9  1162592  8.9
         used (Mb) gc trigger (Mb) max used (Mb)
Ncells 340955 18.3     597831 32.0   597831 32.0
Vcells 621532  4.8    1162592  8.9  1162592  8.9
> system.time({
+     x <- numeric(num)
+    for (i in seq.int(num)) {
+         x[i] <- i
+     }
+ })
   ユーザ   システム       経過 
     0.105      0.001      0.105


> # 瞬殺
> gc(); gc()
         used (Mb) gc trigger (Mb) max used (Mb)
Ncells 340957 18.3     597831 32.0   597831 32.0
Vcells 644789  5.0    1162592  8.9  1162592  8.9
         used (Mb) gc trigger (Mb) max used (Mb)
Ncells 340955 18.3     597831 32.0   597831 32.0
Vcells 644795  5.0    1162592  8.9  1162592  8.9
> system.time({x <- seq(num)}) # これを忘れちゃいけないでしょう
   ユーザ   システム       経過 
         0          0          0
> system.time({x <- seq.int(num)})
   ユーザ   システム       経過 
         0          0          0
> system.time({x <- seq_len(num)})
   ユーザ   システム       経過 
     0.001      0.000      0.000

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« ダメ出し:マルコフ連鎖モン... | トップ | ダメ出し:ifelse はなるべく... »
最新の画像もっと見る

コメントを投稿

ブログラミング」カテゴリの最新記事