zer*_*uno 2 python unix linux python-3.x
我对上述函数结果的精确度非常非常困惑.
对我来说文档根本不清楚,例如这里有两句话:
来自time模块文档
各种实时函数的精度可能低于表示其值或参数的单位所建议的精度.例如,在大多数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)?
Run Code Online (Sandbox Code Playgroud)
PS这是在Python3.4.0上尝试的,在Python2中time.clock(),time.time()我总是在点后得到6个数字,所以1us精度?
精确度与价值变化的频率有关.
如果您可以无限快速地调用这些函数中的任何一个,则每个函数都将以不同的速率返回一个新值.
因为每个都返回一个没有绝对精度的浮点值,所以你不能从它们的返回值中告诉它们具有什么精度.您需要测量值随时间变化的方式,以了解它们的精度.
要显示差异,请运行:
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))
Run Code Online (Sandbox Code Playgroud)
在我的Mac上打印:
clock 0.6716716717
time 0.2892525704
perf_counter 0.1550070010
Run Code Online (Sandbox Code Playgroud)
因此perf_counter,我的架构具有最高的精度,因为它每秒更频繁地更改,使值之间的增量更小.
您可以使用该time.get_clock_info()函数来查询每个方法提供的精度:
>>> 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
Run Code Online (Sandbox Code Playgroud)