26

Rはベクトルで最も効率的に機能するので、ループは避ける必要があります。私は実際にこの方法でコードを書くことを自分自身に教えるのに苦労しています。コードを「ベクトル化」する方法についていくつかのアイデアが欲しいです。st状態( )、plan1(p1) 、plan2()の10,000個の一意でない組み合わせに対して10年間のサンプルデータを作成する例を次に示しますp2

st<-NULL
p1<-NULL
p2<-NULL
year<-NULL
i<-0
starttime <- Sys.time()

while (i<10000) {
    for (years in seq(1991,2000)) {
        st<-c(st,sample(c(12,17,24),1,prob=c(20,30,50)))
        p1<-c(p1,sample(c(12,17,24),1,prob=c(20,30,50)))
        p2<-c(p2,sample(c(12,17,24),1,prob=c(20,30,50)))    
        year <-c(year,years)
    }
        i<-i+1
}
Sys.time() - starttime

これは私のラップトップで実行するのに約8分かかります。予想どおり、それぞれが100,000の値を持つ4つのベクトルになります。ベクトル関数を使用してこれをより速く行うにはどうすればよいですか?

ちなみに、上記のコードをiで1000ループに制限すると、2秒しかかかりませんが、10,000ループには8分かかります。なぜですか?

4

2 に答える 2

9

明らかに、質問を投稿する前に、これにさらに 1 時間取り組むべきでした。それは振り返ってみるととても明白です。:)

R のベクトル ロジックを使用するために、ループを取り出して次のように置き換えました。

st <-   sample(c(12,17,24),10000,prob=c(20,30,50),replace=TRUE)
p1 <-   sample(c(12,17,24),10000,prob=c(20,30,50),replace=TRUE)
p2 <-   sample(c(12,17,24),10000,prob=c(20,30,50),replace=TRUE)
year <- rep(1991:2000,1000)

ほぼ瞬時に 100,000 のサンプルを処理できるようになりました。ベクトルの方が速いことは知っていましたが、だめでした。ループを使用すると 100,000 ループで 1 時間以上かかり、ベクトル アプローチでは 1 秒未満で済むと思います。キックのために、ベクトルを100万にしました。完了するまでに約 2 秒かかりました。失敗するまでテストする必要があるため、10mm を試しましたが、2GB のラップトップでメモリが不足しました。6GB の RAM を搭載した Vista 64 デスクトップに切り替えて、長さ 10mm のベクトルを 17 秒で作成しました。ベクトルの 1 つが 763 MB を超えていたため、100mm ではバラバラになり、R で割り当ての問題が発生しました。

R のベクトルは、私にとって驚くほど高速です。それが私がコンピューター科学者ではなく経済学者である理由だと思います。

于 2009-01-13T18:00:54.133 に答える
6

10000 のループが 1000 のループよりもはるかに長くかかった理由についての質問に答えるには、次のようにします。

主な容疑者は、すべてのループで発生している連結だと思います。データが長くなるにつれて、R はおそらくベクトルのすべての要素を 1 つ長い新しいベクトルにコピーします。小さい (平均 500 要素) データ セットを 1000 回コピーするのは高速です。より大きな (平均 5000 要素) データ セットを 10000 回コピーすると、速度が低下します。

于 2009-01-13T22:09:25.190 に答える