0

条件がある場合、それを適用関数の内側/外側に配置すると、実行時間に大きな影響を与えますか?たとえば:

names = c("Joe", "Jen", "Bob")

if("Joe" %in% names){
     lapply(1:1000000, function(y){
        #Do something computationally intensive
     })
}
if("Jen" %in% names){
    lapply(1:1000000, function(y){
        #Do something computationally intensive
    })
}

対:

lapply(1:1000000, function(y){
    if("Joe" %in% names){
        #Do something computationally intensive
    }
    if("Jen" %in% names){
        #Do something computationally intensive
    }
})

ありがとう

4

1 に答える 1

2

インザifループは非常に高価です。

rbenchmark を使用して確認します。最初を関数 'a' として、2 番目を 'b' として記述すると、次のようになります。

> benchmark(a(), b(), replications=1)
  test replications elapsed relative user.self sys.self user.child sys.child
1  a()            1   0.595     1.00     0.593    0.000          0         0
2  b()            1   4.141     6.96     4.121    0.001          0         0

「ジョー」と「ジェン」の両方を名前に入れることをお勧めします。結果はほぼ同じです。

> benchmark(a(), b(), replications=1)
  test replications elapsed relative user.self sys.self user.child sys.child
1  a()            1   0.600    1.000     0.597        0          0         0
2  b()            1   4.036    6.727     4.016        0          0         0

編集: に指定した式benchmarkはタイミング ループ内で評価されるため、関数の括弧を指定する必要があることに注意してください。

于 2012-11-21T17:40:22.547 に答える