python time模块提供了五个时钟:time、monotonic、perf_counter、process_time和thread_time (以及不推荐的clock)。文档很好地解释了这些钟的作用。
您可以通过time.get_clock_info(<clock_name>)函数获得有关这些时钟的系统相关信息。这尤其是返回这个时钟的resolution,据我理解,这是对该时钟的连续调用之间的最小差异,即不是零。为了测试这一点,我创建了以下代码:
import time
names = ['time', 'monotonic', 'perf_counter', 'process_time', 'thread_time']
for n in names:
info = time.get_clock_info(n)
f = getattr(time, n)
print(n, info)
l = []
for _ in range(1000000):
l.append(f())
deltas = [l[i] - l[i - 1] for i in range(1, len(l)) if l[i] - l[i - 1] != 0]
print(min(deltas, default=0))此代码为我打印以下内容:
time 0.015625
0.00650477409362793
monotonic 0.015625
0.015000000013969839
perf_counter 3.77580764525532e-07
3.7699999988483057e-07
process_time 1e-07
0.015625
thread_time 1e-07
0.015625这很令人惊讶,因为time的实际最小增量比承诺的小2.4倍,而实际最小的process_time和thread_time增量都比承诺的大150.000倍。
为什么会这样呢?这是取决于实现和python不知道实际的分辨率吗?如果是这样,它为什么要假装知道呢?还是我误会了什么?
系统信息:
发布于 2018-07-18 01:52:11
价值“比承诺的150.000倍”是完全好的。代码的执行需要一些时间。您承诺的是,这是最小的差异,您将可以注册,而不是两个连续的调用将得到这个值。而且,这是定时器中值的解析,而不是定时器本身。您可以有一个计时器,它以100 ns的增量计数,但实际上每1U就会增加10个。
另一种方法是:您可以按照日积月累窗口的"time“实现(它使用了GetSystemTimeAdjustment ),您必须深入了解这些描述,看看结果是什么。有趣的一点是,lpTimeIncrement显然只在设置了lpTimeAdjustmentDisabled时才重要--这是cpython不检查的。
perf_counter只是奇怪,不太可能是正确的。它从QueryPerformanceCounter获取值,但是在377 is中执行时间测量是非常不可能的。
为了更好地了解计时器的行为,您还可以对结果进行直方图绘制,而不是使用最小值。
https://stackoverflow.com/questions/51392238
复制相似问题