[解決済み] Rでループが遅いのはなぜですか?
質問
でループが遅いのは知っています。
R
でループが遅いことも、代わりにベクトル化された方法で物事を行うよう試みるべきであることも知っています。
しかし、なぜでしょう?なぜループは遅いのか、そして
apply
は速いのでしょうか?
apply
はいくつかのサブファンクションを呼び出すので、速いとは思えません。
更新しました。
すみません、質問の仕方が悪かったです。ベクトル化を混同していました。
apply
. 私の質問は、そうであるべきでした。
"なぜベクトル化は速いのでしょうか?
どのように解決するのですか?
Rのループが遅いのは、どんなインタプリタ言語でも遅いのと同じ理由です。 演算が多くの余分な荷物を運んでくるからです。
見てください。
R_execClosure
で
eval.c
(を呼び出すために呼ばれる関数です(これは
ユーザー定義関数を呼び出すために呼び出される関数です)。この関数は100行近くあり、あらゆる種類の操作を実行します。
実行環境の作成、環境への引数の割り当てなど、あらゆる種類の操作を行います。
実行環境の構築、環境への引数の割り当てなどです。
C 言語で関数を呼び出すとき、どれだけ少ないか考えてみてください (引数をスタックにプッシュする、ジャンプする、引数をポップする)。 スタックにプッシュし、ジャンプし、引数をポップする)。
というわけで、このようなタイミングになるわけです(joranさんがコメントで指摘されているように。
実際には
apply
の内部 C ループが高速化されているのです。
mean
の内部 C ループです。
apply
は普通の古いRのコードです)。
A = matrix(as.numeric(1:100000))
ループを使用。0.342秒です。
system.time({
Sum = 0
for (i in seq_along(A)) {
Sum = Sum + A[[i]]
}
Sum
})
和を用いる:測り知れないほど小さい。
sum(A)
少し気になるのは、漸近的に、ループはちょうど
として
sum
ループは漸近的には
そこで、考えてみましょう。
# 0.370 seconds
system.time({
I = 0
while (I < 100000) {
10
I = I + 1
}
})
# 0.743 seconds -- double the time just adding parentheses
system.time({
I = 0
while (I < 100000) {
((((((((((10))))))))))
I = I + 1
}
})
(その例を発見したのは ラドフォード ニール )
なぜなら
(
は演算子であり、実際には使用するたびに名前のルックアップが必要だからです。
> `(` = function(x) 2
> (3)
[1] 2
あるいは一般的に、(どんな言語でも)解釈された操作はより多くのステップを必要とします。もちろん、これらのステップには利点もあります。
を行う
というのは
(
のトリックをCで行うことができます。
関連
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] B "の印刷が "#"の印刷より劇的に遅いのはなぜですか?
-
[解決済み] Python 3で「1000000000000000 in range(1000000000000001)」はなぜ速いのですか?
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] 0.1fを0にすると、なぜ10倍もパフォーマンスが落ちるのですか?
-
[解決済み] Swift Betaのパフォーマンス:配列のソート
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
-
[解決済み】data.table vs dplyr:一方がうまくできない、またはうまくできないことを行うことができますか?
-
[解決済み] Entity Frameworkのクエリは遅いが、SqlQueryの同じSQLは速い。
-
[解決済み] 原子演算コスト
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Rのapplyファミリーは構文上の砂糖以上のものなのか?
-
[解決済み] Scalaのパターンマッチはバイトコードレベルでどのように実装されているのですか?
-
[解決済み] ファイルキャッシュをクリアしてパフォーマンステストを繰り返す
-
[解決済み] OFFSET / FETCH NEXTからの総行数取得
-
[解決済み] translateZ(0)に対するCSSのパフォーマンス
-
[解決済み] Rでdata.frameをマージ/ジョインする最速の方法は何ですか?
-
[解決済み] RustのOption型のオーバーヘッドとは?
-
[解決済み] 原子演算コスト
-
[解決済み] なぜ、条件付の手は分岐予測失敗の影響を受けないのですか?
-
[解決済み] S3での1ディレクトリあたりの最大ファイル数