Ich hatte den Vorteil, die anderen Antworten zu lesen. Für den Anfang sollten Leute wie ich wissen, warum wir es hier mit einer so großen Ganzzahl zu tun haben, dass beide Python
und bc
die rechtsassoziative Exponentiation expandieren, was bedeutet, dass dies nicht der Fall ist6^36
wir die Bewertung , sondern 6^46656
die wesentlich größer ist . 1
Mit Variationen der folgenden Befehle können wir einen Durchschnitt für ein bestimmtes Element der Ausgabe von beiden extrahieren time
reservierten Worts als auch des Befehls :
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}'
Es ist möglich, eine andere Route zu wählen und die Datei vollständig aus dem Vergleich zu entfernen. Außerdem können wir das Timing von bc historisch mit dem dc
Befehl vergleichen ersterer ein "Front-End-Prozessor" für letzteren ist. Die folgenden Befehle wurden zeitgesteuert:
echo 6^6^6 | bc
echo 6 6 6 ^ ^ p | dc
echo print 6**6**6 | python2.7
Beachten Sie, dass der dc
Befehl für die Potenzierung linksassoziativ ist.2
Wir haben einige Ergebnisse mit time
(bash) für 1000 Iterationen (in Sekunden):
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
und dc
bieten in diesem Zusammenhang eine vergleichbare Leistung.
Weniger genau 3 ergibt sich aus /usr/bin/time
zB GNUtime
Befehl (Skalengenauigkeit ist hier nicht gültig, aber die Ergebnisse sind ähnlich):
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
Ein Vorteil von /usr/bin/time
ist, dass es die -v
Option bietet, die viel mehr Informationen liefert, die schließlich nützlich sein könnten.
Es ist auch möglich, dies intern sozusagen mit dem timeit
Python-Modul auszuwerten :
python2.7 -m timeit -n 1000 -r 1 'print 6**6**6' | grep 'loops'
1000 loops, best of 1: 55.4 msec per loop
Das ist etwas schneller als das, was wir vorher gesehen haben. Lassen Sie uns den Interpreter selbst ausprobieren:
>>> 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
Das ist das Schnellste, was ich gesehen habe.
Wenn wir eine geringere Exponentiation wie auswerten 6^6
, liefert der Befehl time überraschende Ergebnisse - unter Verwendung der gleichen for
Schleifenbefehle, die wir jetzt verwendet haben:
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
Also mit einer kleineren ganzen Zahl bc
ist das plötzlich viel schneller ?? Vom Systemneustart bis zum zweiten Durchlauf macht es keinen Unterschied. Gleichzeitig erhalten wir, wenn wir timeit
für Python verwenden, Folgendes:
python2.7 -m timeit -n 100000 -r 1 'print 6**6' | grep loops
100000 loops, best of 1: 0.468 usec per loop
Dies ist Mikrosekunden , nicht Millisekunden, und entspricht nicht den viel langsameren Ergebnissen, die mit der for
Schleife erzielt werden . Möglicherweise sind andere Tools erforderlich, um dies weiter zu testen, und wie andere bereits erklärt haben, gibt es hier mehr, als man auf den ersten Blick sieht. Es scheint, dass Python im Szenario der Frage schneller war, aber es ist nicht klar, ob darüber hinaus Schlussfolgerungen gezogen werden können ...
1. Unnötig zu erwähnen, dass es über den Rahmen der arithmetischen Erweiterung von Echo hinausgeht, dh echo $((6**6**6))
- bash
auch dafür ist es zufällig rechtsassoziativ, dh 6^6^6 = 6^(6^6)
.
2. Vergleichen Sie mit diesem: 6 6 ^ 6 ^ p
.
3. Es ist möglich, dass der GNU-Zeitbefehl weitere Informationen liefert, wenn er unter BSD UNIX ausgeführt wird (GNU-Zeitinformationsdokument): Die meisten von 'time' angezeigten Informationen stammen aus dem Systemaufruf 'wait3'. Die Zahlen sind nur so gut wie die von 'wait3' zurückgegebenen. Viele Systeme messen nicht alle Ressourcen, über die "Zeit" berichten kann. Diese Ressourcen werden als Null gemeldet. Die Systeme, die die meisten oder alle Ressourcen messen, basieren auf 4.2 oder 4.3BSD. Spätere BSD-Versionen verwenden einen anderen Speicherverwaltungscode, der weniger Ressourcen misst. - Auf Systemen, die keinen 'wait3'-Aufruf haben, der Statusinformationen zurückgibt, wird stattdessen der' times'-Systemaufruf verwendet. Es liefert viel weniger Informationen als 'wait3', so dass 'time' auf diesen Systemen die meisten Ressourcen als Null anzeigt.