私は他の答えを読むことができました。私のような初心者の人が知っておくべきのために、ここでこのような巨大な整数を持つ理由は、我々している取引は、両方のことであるPython
とはbc
やる右結合、これはされていないことを意味指数の拡張、6^36
我々は評価しているのではなく6^46656
、かなり大きくしたが。1
次のコマンドのバリエーションを使用して、time
予約語とコマンドの両方の出力の特定の要素の平均を抽出できます。
for i in {1..1000}; do (time echo 6^6^6 | bc > /dev/null) 2>&1; done | grep 'rea' | sed -e s/.*m// | awk '{sum += $1} END {print sum / NR}'
for i in {1..1000}; do (/usr/bin/time -v sh -c 'echo 6^6^6 | bc > /dev/null') 2>&1; done | grep 'Use' | sed -e s/.*:// | awk '{sum += $1} END {print sum / NR}'
別のルートに移動して、比較からファイルを完全に削除することができます。また、bcのタイミングをdc
コマンドのようなものと比較できます。歴史的に前者は後者の「フロントエンドプロセッサ」であるためです。次のコマンドのタイミングが取られました。
echo 6^6^6 | bc
echo 6 6 6 ^ ^ p | dc
echo print 6**6**6 | python2.7
このdc
コマンドは、べき乗のために左結合です。2
time
1000回の反復(秒)で(bash)を使用した結果がいくつかあります。
0.229678 real bc
0.228348 user bc
0.000569 sys bc
0.23306 real dc
0.231786 user dc
0.000395 sys dc
0.07 real python
0.065907 user python
0.003141 sys python
bc
dc
このコンテキストで同等のパフォーマンスを提供します。
すなわち、GNU コマンドからの精度が低い3つの結果(スケール精度はここでは無効ですが、結果は同様です):/usr/bin/time
time
0.2224 user bc
0 sys bc
0.23 Elapsed bc
0.22998 user dc
0 sys dc
0.23 Elapsed dc
0.06008 user python
0 sys python
0.07 Elapsed python
利点/usr/bin/time
は、-v
最終的に役立つ可能性のあるはるかに多くの情報を生成するオプションを提供することです。
Pythonモジュールと話すために、これを内部的に評価することもできtimeit
ます。
python2.7 -m timeit -n 1000 -r 1 'print 6**6**6' | grep 'loops'
1000 loops, best of 1: 55.4 msec per loop
これは、以前見たものよりも少し高速です。インタープリター自体を試してみましょう。
>>> import timeit
>>> import sys
>>> import os
>>> T = timeit.Timer("print 6**6**6")
>>> n = int(1000)
>>> f = open(os.devnull, 'w')
>>> sys.stdout = f
>>> t = t.timeit(n)
>>> sys.stdout = sys.__stdout__
>>> print t/n
0.0553743481636
それは私が見た中で最も速いです。
のようなより小さいべき乗を評価する場合6^6
、timeコマンドは驚くべき結果をもたらします-使用したのと同じfor
ループコマンドを使用すると、次のようになります。
0.001001 bc real
0.000304 user
0.000554 sys
0.014 python real i.e. 10x more than bc??
0.010432 user
0.002606 sys
それで、整数bc
が小さいほど、突然、ずっと速くなりますか?? システムの再起動から2回目の実行まで、違いはありません。同時に、timeit
Pythonに使用する場合、次のようになります。
python2.7 -m timeit -n 100000 -r 1 'print 6**6' | grep loops
100000 loops, best of 1: 0.468 usec per loop
これはミリ秒ではなくマイクロ秒であるため、for
ループを使用した非常に遅い結果とは一致しません。これをさらにテストするために他のツールが必要な場合もあります。質問のシナリオではPythonの方が速かったようですが、それ以上に結論を引き出すことができるかどうかは明らかではありません...
1.それは、エコーの算術拡大すなわちのようなものの範囲を超えてい言うまでもなくecho $((6**6**6))
- bash
また、そのIE用右結合であることを起こります6^6^6 = 6^(6^6)
。
2.これと比較してください6 6 ^ 6 ^ p
。
3. BSD UNIX(GNU time info document)で実行すると、GNU timeコマンドがより多くの情報を提供する可能性があります: 'time'で表示されるほとんどの情報は、 'wait3'システムコールから取得されます。数値は、「wait3」によって返される数値と同等です。多くのシステムは、「時間」がレポートできるすべてのリソースを測定するわけではありません。これらのリソースはゼロとして報告されます。ほとんどまたはすべてのリソースを測定するシステムは、4.2または4.3BSDに基づいています。以降のBSDリリースでは、より少ないリソースを測定するさまざまなメモリ管理コードが使用されます。-ステータス情報を返す「wait3」コールを持たないシステムでは、代わりに「times」システムコールが使用されます。提供される情報は「wait3」よりはるかに少ないため、これらのシステムでは「time」はほとんどのリソースをゼロとして報告します。