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 Python
et bc
font une expansion d'exponentiation associative correcte , ce qui signifie que ce n'est pas 6^36
nous évaluons mais plutôt 6^46656
qui 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 time
mot 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 dc
commande, 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 dc
commande 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
bc
et dc
offrent des performances comparables dans ce contexte.
3 résultats moins précis de la commande /usr/bin/time
GNU 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/time
est qu'il offre l' -v
option 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 timeit
module 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 for
commandes 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 bc
est 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 timeit
pour 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 for
boucle. 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 bash
qu'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.