多重ループを一重ループに変えるための範囲リスト作成へのコメント
の編集
http://www.okadajp.org/RWiki/?%E5%A4%9A%E9%87%8D%E3%83%AB%E3%83%BC%E3%83%97%E3%82%92%E4%B8%80%E9%87%8D%E3%83%AB%E3%83%BC%E3%83%97%E3%81%AB%E5%A4%89%E3%81%88%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E7%AF%84%E5%9B%B2%E3%83%AA%E3%82%B9%E3%83%88%E4%BD%9C%E6%88%90%E3%81%B8%E3%81%AE%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88
[
トップ
] [
編集
|
差分
|
バックアップ
|
添付
|
リロード
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
-- 雛形とするページ --
(no template pages)
SIZE(20){COLOR(red){多重ループを一重ループに変えるための範囲リスト作成へのコメント}} よく理解できてはいないのですが,効果ははなはだ疑問です。 記述が簡単になるというのも,私には,逆に思えます。 アルゴリズムを,単純に記述するのがわかりやすくかつ速いのだと思えるのですが? > n <- 200 > m <-100 > > a <- function(n, m) + { + Range <- mult.range(1:n, 1:m) + for (x in Range) x[1] + x[2] + } > system.time(a(n,m)) [1] 11.41406 0.03125 12.10156 0.00000 0.00000 > > b <- function(n,m) + { + for (i in 1:n) for (j in 1:m) i+j + } > system.time(b(n,m)) [1] 0.0703125 0.0000000 0.0859375 0.0000000 0.0000000 ===== 追加 今,もう少し読んでいて,この添字の変化規則は R(または FORTRAN) ではなくて C(とか JavaScript) ではないかと思いました。 R では,最初の添字が一番速く変化する。C では最後の添字が一番速く変化する。 それをわきまえていれば間違いがないのですが,この添字規則に従う配列(?)をRで共用するときには問題が起こります。 ---- この関数を考えざるを得なくなった理由は、あるプログラムで6重ループを(しかもあちこちで)使わざるを得なくなったからです。例えば(実際はもっと複雑です) for (i1 in 1;10) { for (i2 in 1;10) { for (i3 in 1;10) { for (i4 in 1;10) { for (i5 in 1;10) { for (i6 in 1;10) { 関数本体 }}}}}} こうしたコードがあちこちにでてくると、エディタで全体を見回すことが難しくなり、編集がしにくなります。特に多数の括弧が煩わし(ループが増えると括弧を使わざるを得なくなる)くなります。これが真の問題でした。スピードの点では、コメントに述べたように、少数の繰り返しでは効果は見えにくいです。また速度が逆に遅くなる例を作ることもできるでしょう。アルゴリズムを素直にコード化するのが最善 and/or 最速かどうかは大いに疑問です。実際、私の経験では、まずアルゴリズムに素直なコードを書いて、使いものにならなくて、あちこち工夫せざるを得なくなることの方多いです。勿論、これはプログラムの内容次第でしょう。なお、多重範囲は配列ではなく、ベクトルのリストです。添字変化順序についてのご指摘はその通りです。(私自身はそうした規則にセンシティブなプログラムは書かない、というより書けない) > foo <- function () { for (i in 1:10) for (j in 1:10) for (k in 1:10) x <- 1 # ループの効果だけを見るための無意味な表現式 } > foo1 <- function () { for (i in Range) x <- 1 } > system.time(Range <- mult.range(mult.range(1:10,1:10),1:10)) # 範囲リストは予め作っておいて再利用! [1] 0.02 0.01 0.04 0.00 0.00 > system.time(for (i in 1:1000) foo()) [1] 0.93 0.04 1.07 0.00 0.00 > system.time(for (i in 1:1000) foo1()) [1] 0.48 0.00 0.50 0.00 0.00
タイムスタンプを変更しない
SIZE(20){COLOR(red){多重ループを一重ループに変えるための範囲リスト作成へのコメント}} よく理解できてはいないのですが,効果ははなはだ疑問です。 記述が簡単になるというのも,私には,逆に思えます。 アルゴリズムを,単純に記述するのがわかりやすくかつ速いのだと思えるのですが? > n <- 200 > m <-100 > > a <- function(n, m) + { + Range <- mult.range(1:n, 1:m) + for (x in Range) x[1] + x[2] + } > system.time(a(n,m)) [1] 11.41406 0.03125 12.10156 0.00000 0.00000 > > b <- function(n,m) + { + for (i in 1:n) for (j in 1:m) i+j + } > system.time(b(n,m)) [1] 0.0703125 0.0000000 0.0859375 0.0000000 0.0000000 ===== 追加 今,もう少し読んでいて,この添字の変化規則は R(または FORTRAN) ではなくて C(とか JavaScript) ではないかと思いました。 R では,最初の添字が一番速く変化する。C では最後の添字が一番速く変化する。 それをわきまえていれば間違いがないのですが,この添字規則に従う配列(?)をRで共用するときには問題が起こります。 ---- この関数を考えざるを得なくなった理由は、あるプログラムで6重ループを(しかもあちこちで)使わざるを得なくなったからです。例えば(実際はもっと複雑です) for (i1 in 1;10) { for (i2 in 1;10) { for (i3 in 1;10) { for (i4 in 1;10) { for (i5 in 1;10) { for (i6 in 1;10) { 関数本体 }}}}}} こうしたコードがあちこちにでてくると、エディタで全体を見回すことが難しくなり、編集がしにくなります。特に多数の括弧が煩わし(ループが増えると括弧を使わざるを得なくなる)くなります。これが真の問題でした。スピードの点では、コメントに述べたように、少数の繰り返しでは効果は見えにくいです。また速度が逆に遅くなる例を作ることもできるでしょう。アルゴリズムを素直にコード化するのが最善 and/or 最速かどうかは大いに疑問です。実際、私の経験では、まずアルゴリズムに素直なコードを書いて、使いものにならなくて、あちこち工夫せざるを得なくなることの方多いです。勿論、これはプログラムの内容次第でしょう。なお、多重範囲は配列ではなく、ベクトルのリストです。添字変化順序についてのご指摘はその通りです。(私自身はそうした規則にセンシティブなプログラムは書かない、というより書けない) > foo <- function () { for (i in 1:10) for (j in 1:10) for (k in 1:10) x <- 1 # ループの効果だけを見るための無意味な表現式 } > foo1 <- function () { for (i in Range) x <- 1 } > system.time(Range <- mult.range(mult.range(1:10,1:10),1:10)) # 範囲リストは予め作っておいて再利用! [1] 0.02 0.01 0.04 0.00 0.00 > system.time(for (i in 1:1000) foo()) [1] 0.93 0.04 1.07 0.00 0.00 > system.time(for (i in 1:1000) foo1()) [1] 0.48 0.00 0.50 0.00 0.00
テキスト整形のルールを表示する