首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python2 2/3中的time.clock()和time.time()分辨率

Python2 2/3中的time.clock()和time.time()分辨率
EN

Stack Overflow用户
提问于 2014-09-13 18:52:03
回答 2查看 3.1K关注 0票数 2

我对上述函数结果的精确性感到非常非常困惑。

对我来说,文档一点也不清楚,例如,这里有两句话:

来自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次呢?

关于分辨率,我不知道我调用每个函数的确切分辨率是什么,所以我尝试了以下几点,并在评论中添加了我的猜测:

代码语言:javascript
运行
复制
>>> 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的精度?

EN

回答 2

Stack Overflow用户

发布于 2014-09-13 18:52:48

精度与值的变化频率有关。

如果您可以无限快地调用这些函数,每个函数都会以不同的速率返回一个新值。

因为每个值都返回一个浮点值,而浮点值没有绝对精度,因此您无法从它们的返回值中判断出它们的精度。您需要测量值随时间的变化情况,以查看它们的精度。

要显示差异,请运行:

代码语言:javascript
运行
复制
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上这个指纹:

代码语言:javascript
运行
复制
clock        0.6716716717
time         0.2892525704
perf_counter 0.1550070010

因此,perf_counter在我的体系结构中具有最大的精度,因为它每秒变化的频率更高,使得值之间的增量更小。

您可以使用 function来查询每个方法提供的精度:

代码语言:javascript
运行
复制
>>> 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
票数 5
EN

Stack Overflow用户

发布于 2022-03-09 18:07:42

只是想要更新这一点,因为它最近发生了一些变化。

在ubuntu中使用Python3版本Python3.8.11

没有time.clock

接受的答案中的delta方法没有给出好的度量标准。运行它们几次,并交换订单,您将看到糟糕的变化。

然而..。

代码语言:javascript
运行
复制
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

两者都显示出纳秒分辨率。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25826537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档