Daniel Lichtblau pointed outは、素因数(PrimeOmega
)の数と整数nの別個の素因数(PrimeNu
)の数の違いを得る2通りの方法でタイミングの違いに驚いた。だから私はもう少しそれを調べることにした。Mathematicaでのこれらのルーチンの相対効率はなぜなのでしょうか?
以下の機能g1
およびg2
は、ダニエルと他の3つの使用されたonesのわずかなバリエーションです。それらはすべて、正方形のない整数の数を1からnまで返します。しかし、その違いはかなり劇的です。誰もが違いの背後にある理由を説明することができます。特に、g5
のSum
がそのようなスピードの利点を提供するのはなぜですか?
g1[n_] := Count[PrimeOmega[Range[n]] - PrimeNu[Range[n]], 0]
g2[n_] := Count[With[{fax = FactorInteger[#]},
Total[fax[[All, 2]]] - Length[fax]] & /@ Range[n], 0]
g3[n_] := Count[SquareFreeQ/@ Range[n], True]
(* g3[n_] := Count[SquareFreeQ[#] & /@ Range[n], True] Mr.Wizard's suggestion
incorporated above. Better written but no significant increase in speed. *)
g4[n_] := n - Count[MoebiusMu[Range[n]], 0]
g5[n_] := Sum[MoebiusMu[d]*Floor[(n - 1)/d^2], {d, 1, Sqrt[n - 1]}]
比較:
n = 2^20;
Timing[g1[n]]
Timing[g2[n]]
Timing[g3[n]]
Timing[g4[n]]
Timing[g5[n]]
結果:Mysticial後者ROという可能性を提起
:
{44.5867, 637461}
{11.4228, 637461}
{4.43416, 637461}
{1.00392, 637461}
{0.004478, 637461}
編集utineは注文のメリットを享受していました。つまり、キャッシュが行われている可能性があります。
それでは、逆の順序で比較を実行してみましょう:逆転比較の
n = 2^20;
Timing[g5[n]]
Timing[g4[n]]
Timing[g3[n]]
Timing[g2[n]]
Timing[g1[n]]
結果:
{0.003755, 637461}
{0.978053, 637461}
{4.59551, 637461}
{11.2047, 637461}
{44.5979, 637461}
評決:妥当な推測が、データによってサポートされていません。
RedNineは誰ですか? –
btw、 'SquareFreeQ [#]&/ @ Range [n]'は冗長です。 'SquareFreeQ/@ Range [n]'で十分です。 –
上記のコメントの精緻化:式の最初の要素を抽出する必要がある場合は、一般的に 'function [#]&'という形式の純粋な関数しか表示されません。例えば、Sqrt [First] [#]と/ @ {{2,4,6}、{8,10,12}}の代わりに 'Sqrt [#]と@@@ {{2、 4、6}、{8、10、12}} –