【问题标题】:Get timer ticks in Python在 Python 中获取计时器刻度
【发布时间】:2010-09-14 10:54:51
【问题描述】:

我只是想为一段代码计时。伪代码如下:

start = get_ticks()
do_long_code()
print "It took " + (get_ticks() - start) + " seconds."

这在 Python 中看起来如何?

更具体地说,我如何获取自午夜以来的滴答数(或者 Python 组织该时间)?

【问题讨论】:

标签: python timer


【解决方案1】:

time模块中,有两个定时函数:timeclocktime 给你“墙”时间,如果这是你关心的。

但是,python docsclock 应该用于基准测试。请注意,clock 在不同系统中的行为不同:

  • 在 MS Windows 上,它使用 Win32 函数 QueryPerformanceCounter(),“分辨率通常优于微秒”。它没有特殊含义,它只是一个数字(它会在您在进程中第一次调用clock 时开始计数)。
# 毫秒窗口 t0=time.clock() 做一点事() t= time.clock() - t0 # t 是经过的墙壁秒数(浮点数)
  • 在 *nix 上,clock 报告 CPU 时间。现在,这是不同的,并且很可能是您想要的值,因为您的程序几乎不是唯一请求 CPU 时间的进程(即使您没有其他进程,内核也会不时使用 CPU 时间)。因此,这个数字通常小于墙上时间(即 time.time() - t0),在对代码进行基准测试时更有意义:
# linux t0=time.clock() 做一点事() t= time.clock() - t0 # t 是经过的 CPU 秒数(浮点数)

除此之外,timeit 模块还有 Timer 类,它应该使用最适合的可用功能进行基准测试。

¹ 除非线程碍事……

² Python ≥3.3:有time.perf_counter() and time.process_time()perf_counter 正在被timeit 模块使用。

【讨论】:

  • time.clock() 在 *nix 上的精度可能很差。 Use timeit.default_timer,以获得最佳计时器来测量不同操作系统和 Python 版本的时间性能。
【解决方案2】:

您需要的是来自time 模块的time() 函数:

import time
start = time.time()
do_long_code()
print "it took", time.time() - start, "seconds."

您可以使用timeit 模块获得更多选项。

【讨论】:

    【解决方案3】:

    这是我最近开始使用的一个解决方案:

    class Timer:
        def __enter__(self):
            self.begin = now()
    
        def __exit__(self, type, value, traceback):
            print(format_delta(self.begin, now()))
    

    你像这样使用它(你至少需要 Python 2.5):

    with Timer():
        do_long_code()
    

    当您的代码完成时,Timer 会自动打印出运行时间。甜的!如果我想在 Python 解释器中快速调整某些东西,这是最简单的方法。

    这里是 'now' 和 'format_delta' 的示例实现,尽管您可以随意使用您喜欢的时间和格式化方法。

    import datetime
    
    def now():
        return datetime.datetime.now()
    
    # Prints one of the following formats*:
    # 1.58 days
    # 2.98 hours
    # 9.28 minutes # Not actually added yet, oops.
    # 5.60 seconds
    # 790 milliseconds
    # *Except I prefer abbreviated formats, so I print d,h,m,s, or ms. 
    def format_delta(start,end):
    
        # Time in microseconds
        one_day = 86400000000
        one_hour = 3600000000
        one_second = 1000000
        one_millisecond = 1000
    
        delta = end - start
    
        build_time_us = delta.microseconds + delta.seconds * one_second + delta.days * one_day
    
        days = 0
        while build_time_us > one_day:
            build_time_us -= one_day
            days += 1
    
        if days > 0:
            time_str = "%.2fd" % ( days + build_time_us / float(one_day) )
        else:
            hours = 0
            while build_time_us > one_hour:
                build_time_us -= one_hour
                hours += 1
            if hours > 0:
                time_str = "%.2fh" % ( hours + build_time_us / float(one_hour) )
            else:
                seconds = 0
                while build_time_us > one_second:
                    build_time_us -= one_second
                    seconds += 1
                if seconds > 0:
                    time_str = "%.2fs" % ( seconds + build_time_us / float(one_second) )
                else:
                    ms = 0
                    while build_time_us > one_millisecond:
                        build_time_us -= one_millisecond
                        ms += 1
                    time_str = "%.2fms" % ( ms + build_time_us / float(one_millisecond) )
        return time_str
    

    如果您有首选的格式化方法,或者是否有更简单的方法来完成所有这些操作,请告诉我!

    【讨论】:

      【解决方案4】:

      python 中的time module 允许您访问clock() 函数,该函数以秒为单位返回浮点数。

      不同的系统将根据其内部时钟设置(每秒滴答声)具有不同的精度,但通常至少低于 20 毫秒,在某些情况下优于几微秒。

      -亚当

      【讨论】:

        【解决方案5】:
        import datetime
        
        start = datetime.datetime.now()
        do_long_code()
        finish = datetime.datetime.now()
        delta = finish - start
        print delta.seconds
        

        从午夜开始:

        import datetime
        
        midnight = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
        now = datetime.datetime.now()
        delta = now - midnight
        print delta.seconds
        

        【讨论】:

        • 这不考虑日期时间中过去的天数(技术上是微秒,但因为我们不关心那些......),所以如果长代码比你花费更长的时间,那将是非常不准确的想想。
        【解决方案6】:

        如果你有很多语句要计时,你可以使用这样的语句:

        class Ticker:
            def __init__(self):
                self.t = clock()
        
            def __call__(self):
                dt = clock() - self.t
                self.t = clock()
                return 1000 * dt
        

        那么您的代码可能如下所示:

        tick = Ticker()
        # first command
        print('first took {}ms'.format(tick())
        # second group of commands
        print('second took {}ms'.format(tick())
        # third group of commands
        print('third took {}ms'.format(tick())
        

        这样您就不需要在每个块之前输入t = time() 并在其之后输入1000 * (time() - t),同时仍然可以控制格式(尽管您也可以轻松地将其放入Ticket)。

        这是一个微不足道的收获,但我认为这很方便。

        【讨论】:

          猜你喜欢
          • 2010-09-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-07
          • 1970-01-01
          • 1970-01-01
          • 2021-03-11
          • 2015-02-07
          相关资源
          最近更新 更多