21

R コードで科学表記法を使用する10^6と (私が習慣的に行っているように)、電卓表現を使用するよりも計算時間が大幅に長くなります1e6

> system.time(for (t in 1:1e7) x=10^6) 
  utilisateur     système      écoulé 
        4.792       0.000       4.281 
> system.time(for (t in 1:1e7) x=1e6) 
 utilisateur     système      écoulé 
       0.804       0.000       1.051
> system.time(for (t in 1:1e7) x=exp(6*log(10)))
 utilisateur     système      écoulé 
       6.301       0.000       5.702

R が を計算する10^6のとほぼ同じ時間で再計算するのはなぜexp{6*log(10)}ですか? R が を計算するときに関数を実行するという事実は理解できます10^6が、なぜこのようにコーディングされたのでしょうか?

4

2 に答える 2

35

1e6定数であり、パーサーによってそのように認識されるのに対し、10^6はさらに評価する必要がある関数呼び出しとして解析されます (関数の呼び出しによって^())。前者は関数呼び出しの高価なオーバーヘッドを回避するため、評価ははるかに高速です!

class(substitute(1e6))
# [1] "numeric"
class(substitute(10^6))
# [1] "call"

それが呼び出しであることをよりよく確認するために、次のように分析できます。

as.list(substitute(10^6))
# [[1]]
# `^`
# 
# [[2]]
# [1] 10
# 
# [[3]]
# [1] 6

その他のいくつかの興味深いケース:

## negative numbers are actually parsed as function calls
class(substitute(-1))
[1] "call"

## when you want an integer, 'L' notation lets you avoid a function call 
class(substitute(1000000L))
# [1] "integer"
class(substitute(as.integer(1000000)))
# [1] "call"
于 2015-05-02T15:59:22.433 に答える
7

1e6リテラル数値を指定している場合。そこでは計算は行われません。

を要求する10^6と、R は 10 を 6 乗する仕事をします。は^数値演算子です。基数 10 に対して特別なことは何もしません。 と の違いはわかりませ10^612^14。答えを見つけるために計算をしなければなりません。

于 2015-05-02T15:59:08.980 に答える