【问题标题】:Measuring long time intervals in python在python中测量长时间间隔
【发布时间】:2020-03-25 22:16:46
【问题描述】:

在搜索了 Python 3.x 中测量时间的不同方法后,我决定使用 time 模块中的 perf_counter() 函数。当我使用需要几秒钟才能运行的函数对其进行测试时,它运行良好,但我想从中提取计时结果的代码需要数十小时才能运行。

今天我得到了结果,令我惊讶的是,计时结果大约是几分之一秒,这太荒谬了。因此,我来​​问你为什么会出现这种情况,以及如何在 Python 3.x 中准确测量长时间间隔。

用到的代码如下:

optimization_times = []
for i in range(30):
    # Search parameters on train set
    print("Round %d" % i)
    time_start = time.perf_counter()
    solution = metaheuristic.optimize()
    time_end = time.perf_counter()
    # Keep time spent
    optimization_times.append(time_end - time_start)

操作系统:Ubuntu 18.04

提前谢谢你。

【问题讨论】:

    标签: python python-3.x intervals timing


    【解决方案1】:

    你看到了一个环绕。

    来自docs

    ...具有最高可用分辨率的时钟,用于测量持续时间。

    如果你的间隔是几十个小时,你应该坚持time.time(), 它有足够的分辨率满足您的需求。

    如果你认为你真的需要疯狂的数字精度, 然后将 time.time() 与 perf_counter() 结合, 并且旁边还有一个程序 定期记录这两个值,以便您可以 将 perf_counter 偏移量同步到全球时间。 这样的日志对应 让你的 48 位计数器更宽几位, 它可以让您观察每个环绕事件。

    【讨论】:

      【解决方案2】:

      time.perf_counter() → float

      返回性能计数器的值(以小数秒为单位),即具有最高可用分辨率的时钟以测量短持续时间。它确实包括睡眠期间经过的时间,并且是系统范围的。返回值的参考点是未定义的,因此只有连续调用的结果之间的差异才有效。

      --

      "what is a fractional second?"

      小数秒是时间中不是整数的部分。因此,如果您有像 12345678.9 这样的时间,则小数秒为 0.9

      (巴塞尔·斯塔林克维奇)


      可能的解决方案是timeit:

      import timeit
      import time
      
      def func():
          time.sleep(0.05)
      
      timeit.timeit(lambda: func(), number=10)
      

      输出:

      0.528169795999986
      

      【讨论】:

      • 我认为这种小数秒的定义在这种情况下不成立,因为 time.perf_counter() 可以毫无问题地测量超过十秒
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-26
      • 1970-01-01
      • 2019-05-17
      • 1970-01-01
      • 2011-11-17
      相关资源
      最近更新 更多