我对上述函数结果的精确性感到非常非常困惑。
对我来说,文档一点也不清楚,例如,这里有两句话:
来自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)?
P.S.这是在Python3.4.0上尝试的,在Python2 for time.clock()
和time.time()
中,我总是在点之后得到6个数字,那么1U的精度?
发布于 2014-09-13 18:52:48
精度与值的变化频率有关。
如果您可以无限快地调用这些函数,每个函数都会以不同的速率返回一个新值。
因为每个值都返回一个浮点值,而浮点值没有绝对精度,因此您无法从它们的返回值中判断出它们的精度。您需要测量值随时间的变化情况,以查看它们的精度。
要显示差异,请运行:
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
在我的体系结构中具有最大的精度,因为它每秒变化的频率更高,使得值之间的增量更小。
您可以使用 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
发布于 2022-03-09 18:07:42
只是想要更新这一点,因为它最近发生了一些变化。
在ubuntu中使用Python3版本Python3.8.11
没有time.clock
接受的答案中的delta方法没有给出好的度量标准。运行它们几次,并交换订单,您将看到糟糕的变化。
然而..。
import time
for timer in time.time, time.perf_counter:
name = timer.__name__
print('{:<12} {:.10f}'.format(name, time.get_clock_info(name).resolution))
time 0.0000000010
perf_counter 0.0000000010
两者都显示出纳秒分辨率。
https://stackoverflow.com/questions/25826537
复制相似问题