No.10346 Re: 空のベクトルを用意する場合 【青木繁伸】 2009/07/12(Sun) 07:21
二番目の方法が実行時間的には圧倒的に優れています。最も優れている方法は for を使わないというのは別として。実行時間は以下のようになります。> n <- 1e5なお,最初のメモリー確保で別のタイプにしても違いはありません(最終的には最後に実行された結果により型は変わります)
> system.time({a <- NULL; for (i in 1:n) a[i] <- i})
ユーザ システム 経過
24.428 19.742 43.925
> system.time({a <- numeric(n); for (i in 1:n) a[i] <- i})
ユーザ システム 経過
0.353 0.002 0.376
> system.time(a <- 1:n)
ユーザ システム 経過
0.000 0.001 0.001> system.time({a <- numeric(n); for (i in 1:n) a[i] <- i})
ユーザ システム 経過
0.362 0.002 0.363
> class(a)
[1] "numeric"
> a[1:5]
[1] 1 2 3 4 5
> a[1] <- "abc"
> class(a)
[1] "character"
> a[1:5]
[1] "abc" "2" "3" "4" "5"
No.10348 Re: 空のベクトルを用意する場合 【波音】 2009/07/12(Sun) 17:29
回答ありがとうございます。
私の環境で同じく実行してみると:
> system.time({a <- NULL; for(i in 1:n) a[i] <- 1})
ユーザ システム 経過
85.31 0.01 85.89
> system.time({a <- numeric(n); for (i in 1:n) a[i] <- i})
ユーザ システム 経過
1.14 0.00 1.14
となりました(^_^;)
古 い方のパソコンだとユーザCPU時間から順に106.95, 0.12, 109.96となりましたが,単純に考えて100倍くらい時間が余分にかかるわけですから,これは確かに圧倒的にnumeric()を使う方が優れている のですね(大規模な計算プログラムを実行させる際にはより壊滅的ですね,,,)。
● 「統計学関連なんでもあり」の過去ログ--- 042 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る