Я мав перевагу прочитати інші відповіді. Для початківців такі люди, як я, повинні знати причину, чому ми маємо справу з таким величезним цілим числом, це те, що обидва 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", тому в цих системах "час" повідомляє більшість ресурсів як нуль.