我对上述功能的结果的准确性感到非常非常困惑 对我来说,文档根本不清楚,例如这里有两句话:
来自time
模块文档
各种实时函数的精度可能低于表示其值或参数的单位所建议的精度。的 E.g。在大多数Unix系统上,时钟“滴答”的速度仅为每秒50或100次。
来自timeit
模块文档
以特定于平台的方式定义默认计时器。在Windows上,time.clock()具有微秒粒度,但time.time()的粒度是1/60秒。 在Unix上,time.clock()具有1/100的粒度,而time.time()更精确。在任一平台上,default_timer()都可以测量挂钟时间,而不是CPU时间。这意味着在同一台计算机上运行的其他进程可能会干扰计时。
现在因为实时,在Unix中,它由time.time()
返回,并且它的分辨率远远高于1/100,它怎么能每秒“滴答”50或100次呢?
总是关于解决方案,我无法理解我调用每个函数的确切分辨率,所以我尝试了以下内容并在评论中进行了猜测:
>>> time.clock()
0.038955 # a resolution of microsecond?
>>> time.time()
1410633457.0955694 # a resolution of 10-7 second?
>>> time.perf_counter()
4548.103329075 # a resolution of 10-9 second (i.e nanosecond)?
P.S。这是在Python3.4.0上尝试的,在Python2中time.clock()
和time.time()
我在点后总是得到6个数字,所以1us精度?
答案 0 :(得分:5)
精确度与值变化的频率相关。
如果您可以无限快速地调用这些函数中的任何一个,则每个函数都会以不同的速率返回一个新值。
因为每个都返回一个没有绝对精度的浮点值,所以你不能从它们的返回值中告诉它们具有什么精度。您需要测量值随时间变化的方式,以了解它们的精度。
要显示差异,请运行:
import time
def average_deltas(*t):
deltas = [t2 - t1 for t1, t2 in zip(t, t[1:])]
return sum(deltas) / len(deltas)
for timer in time.clock, time.time, time.perf_counter:
average = average_deltas(*(timer() for _ in range(1000))) * 10 ** 6
print('{:<12} {:.10f}'.format(timer.__name__, average))
在我的Mac上打印:
clock 0.6716716717
time 0.2892525704
perf_counter 0.1550070010
所以perf_counter
在我的架构上具有最高的精度,因为它每秒更改一次,使值之间的差值更小。
您可以使用time.get_clock_info()
function来查询每种方法提供的精确度:
>>> for timer in time.clock, time.time, time.perf_counter:
... name = timer.__name__
... print('{:<12} {:.10f}'.format(name, time.get_clock_info(name).resolution))
...
clock 0.0000010000
time 0.0000010000
perf_counter 0.0000000010