我受益于阅读其他答案。对于初学者喜欢我的人应该知道为什么我们在这里处理如此庞大的整数是,无论是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
在这种情况下提供可比的性能。
来自GNU 命令的精度较低的3个结果(比例精度在此处无效,但结果相似):/usr/bin/time
time
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的算术扩展的范围,即echo $((6**6**6))
- bash
也恰好与该函数正确关联6^6^6 = 6^(6^6)
。
2.与此比较:6 6 ^ 6 ^ p
。
3.当在BSD UNIX上运行时,GNU time命令有可能提供更多信息(GNU时间信息文档):“ time”显示的大多数信息均来自“ wait3”系统调用。这些数字仅与“ wait3”返回的数字一样好。许多系统无法衡量“时间”可以报告的所有资源。这些资源被报告为零。衡量大部分或全部资源的系统均基于4.2或4.3BSD。更高的BSD发行版使用了不同的内存管理代码,这些代码可测量更少的资源。-在没有返回状态信息的“ wait3”调用的系统上,将使用“ times”系统调用。它提供的信息比“ wait3”少得多,因此在那些系统上,“时间”将大多数资源报告为零。