代码之家  ›  专栏  ›  技术社区  ›  MegaIng Mischa Lisovyi

时间的意义。获取时钟信息()。分辨率

  •  2
  • MegaIng Mischa Lisovyi  · 技术社区  · 7 年前

    巨蟒 time 模块提供五个时钟: 时间 , monotonic 我是说, perf_counter 我是说, process_time ,和 thread_time (以及被弃用的 clock ). 这些钟的作用在 documentation 是的。

    您可以使用 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
    

    这很令人惊讶,因为 时间 比承诺的小2.4倍,实际的最小增量 处理时间 线程时间 都是承诺的15万倍。

    为什么?这取决于实现,而python不知道实际的解决方案吗如果是那样的话,为什么要假装知道?还是我误会了什么?

    系统信息:

    • Windows 10 64位
    • 蟒蛇3.7 64位
    1 回复  |  直到 7 年前
        1
  •  1
  •   viraptor    7 年前

    “15万倍于承诺”的价值观是完全正确的代码的执行需要一些时间你得到的承诺是,这是你可以注册的最小差异,而不是连续两次调用都会得到这个值。另外,这是计时器中值的分辨率,而不是计时器本身。你可以有一个以100ns为增量的计时器,但实际上每1us加10个。

    另一种方法是:您可以按照windows的“time”实现 pygettimeofday (使用 GetSystemTimeAdjustment )你必须深入研究这些描述,看看结果如何。有趣的是 lpTimeIncrement 显然只有在 lpTimeAdjustmentDisabled 已经设置好了——这是cpython没有检查的。

    这个 perf_counter 只是奇怪而且不太可能是正确的。它的价值来自 QueryPerformanceCounter ,但在377ns内执行时间测量是不太可能的。

    为了更好地了解计时器的行为,您还可以绘制结果的直方图,而不是使用最小值。