Я мав перевагу прочитати інші відповіді. Для початківців такі люди, як я, повинні знати причину, чому ми маємо справу з таким величезним цілим числом, це те, що обидва 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(bash) за 1000 ітерацій (у секундах):
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пропонують порівнянні показники в цьому контексті.
Менш точні 3 результати, /usr/bin/timeтобто timeкоманда GNU (точність шкали тут не вірна, але результати схожі):
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варіант, який дає набагато більше інформації, яка може бути корисною з часом.
Можна також оцінити це внутрішньо, так би мовити з timeitмодулем 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
Це трохи швидше, ніж те, що ми бачили раніше. Спробуємо сам перекладач:
>>> 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раптом набагато швидше ?? Від перезавантаження системи до другого запуску значення не має. Але в той же час, якщо ми використовуємо 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також буває правильним асоціативним для цього, тобто 6^6^6 = 6^(6^6).
2. Порівняйте з цим: 6 6 ^ 6 ^ p.
3. Можливо, команда часу GNU надає додаткову інформацію при запуску на BSD UNIX (GNU time info document): Більшість інформації, показаної 'time', походить із системного виклику 'wait3'. Цифри такі ж хороші, як і ті, які повернув "wait3". Багато систем не оцінюють усі ресурси, про які „час” може звітувати; ці ресурси повідомляються як нульові. Системи, які вимірюють більшість або всі ресурси, базуються на 4.2 або 4.3BSD. Пізніше випуски BSD використовують різний код управління пам'яттю, який вимірює менше ресурсів. - У системах, у яких немає виклику "wait3", який повертає інформацію про стан, замість цього використовується системний виклик "times". Він надає набагато менше інформації, ніж "wait3", тому в цих системах "час" повідомляє більшість ресурсів як нуль.