J'ai eu l'avantage de lire les autres réponses. Pour commencer, les gens comme moi devraient savoir pourquoi nous avons affaire à un entier aussi énorme ici, c'est que les deux Pythonet bcfont une expansion d'exponentiation associative correcte , ce qui signifie que ce n'est pas 6^36nous évaluons mais plutôt 6^46656qui est considérablement plus grand. 1
En utilisant des variations sur les commandes suivantes, nous pouvons extraire une moyenne pour un élément spécifique de la sortie du timemot réservé et de la commande:
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}'
Il est possible de suivre une autre voie et de supprimer entièrement le fichier de la comparaison. En outre, nous pouvons comparer le timing de bc avec quelque chose comme la dccommande, car historiquement le premier est un "processeur frontal" au second. Les commandes suivantes ont été chronométrées:
echo 6^6^6 | bc
echo 6 6 6 ^ ^ p | dc
echo print 6**6**6 | python2.7
Notez que la dccommande est associative à gauche pour l'exponentiation. 2
Nous avons quelques résultats avec time(bash) pour 1000 itérations (en secondes):
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
bcet dcoffrent des performances comparables dans ce contexte.
3 résultats moins précis de la commande /usr/bin/timeGNU time(la précision de l'échelle n'est pas valide ici mais les résultats sont similaires):
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
Un avantage /usr/bin/timeest qu'il offre l' -voption qui fournit beaucoup plus d'informations qui pourraient éventuellement être utiles.
Il est également possible d'évaluer cela en interne pour ainsi dire avec le timeitmodule Python:
python2.7 -m timeit -n 1000 -r 1 'print 6**6**6' | grep 'loops'
1000 loops, best of 1: 55.4 msec per loop
C'est un peu plus rapide que ce que nous avons vu auparavant. Essayons l'interprète lui-même:
>>> 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
C'est le plus rapide que j'ai vu.
Si nous évaluons une exponentiation moindre comme 6^6, alors la commande time donne des résultats surprenants - en utilisant les mêmes forcommandes de boucle que nous avons utilisées, nous avons maintenant:
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
Donc, avec un entier plus petit bcest tout d'un coup beaucoup plus rapide ?? Du redémarrage du système à la deuxième exécution, cela ne fait aucune différence. Pourtant, en même temps, si nous utilisons timeitpour Python, nous obtenons:
python2.7 -m timeit -n 100000 -r 1 'print 6**6' | grep loops
100000 loops, best of 1: 0.468 usec per loop
Ce sont des microsecondes , pas des millisecondes, donc cela ne correspond pas aux résultats beaucoup plus lents utilisant la forboucle. Peut-être que d'autres outils sont nécessaires pour tester cela plus loin et comme d'autres l'ont expliqué, il y a plus que ce qui semble évident ici. Il semble que Python ait été plus rapide dans le scénario de la question, mais il n'est pas clair si des conclusions peuvent être tirées au-delà de cela ...
1. Inutile de dire que cela dépasse la portée de quelque chose comme l'expansion arithmétique de l'écho, c'est echo $((6**6**6))-à- dire bashqu'il se trouve également être associatif à droite pour cela, c'est-à-dire 6^6^6 = 6^(6^6).
2. Comparer avec ceci: 6 6 ^ 6 ^ p.
3. Il est possible que la commande GNU time fournisse plus d'informations lorsqu'elle est exécutée sur BSD UNIX (GNU time info document): la plupart des informations affichées par 'time' sont dérivées de l'appel système 'wait3'. Les nombres sont aussi bons que ceux retournés par 'wait3'. De nombreux systèmes ne mesurent pas toutes les ressources dont le «temps» peut rendre compte; ces ressources sont déclarées nulles. Les systèmes qui mesurent la plupart ou la totalité des ressources sont basés sur 4.2 ou 4.3BSD. Les versions ultérieures de BSD utilisent un code de gestion de mémoire différent qui mesure moins de ressources. - Sur les systèmes qui n'ont pas d'appel «wait3» qui renvoie des informations d'état, l'appel système «times» est utilisé à la place. Il fournit beaucoup moins d'informations que 'wait3', donc le temps de ces systèmes signale la plupart des ressources comme nulles.