8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

如何在 Python 中测量经过的时间?

bhito 2月前

117 0

我想测量执行某个函数所花费的时间。我无法让 timeit 工作:import timeitstart = timeit.timeit()print(\'hello\')end = timeit.timeit()print(end - start)

我想测量执行某个函数所花费的时间。我无法开始 timeit 工作:

import timeit
start = timeit.timeit()
print("hello")
end = timeit.timeit()
print(end - start)
帖子版权声明 1、本帖标题:如何在 Python 中测量经过的时间?
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由bhito在本站《matplotlib》版块原创发布, 转载请注明出处!
最新回复 (0)
  • timeit.timeit() 打印执行其参数所需的时间,默认情况下为 \'pass\'。您必须改用 start= time.time() end = time.time()

  • 使用 time.time() 来测量两点之间经过的挂钟时间:

    import time
    
    start = time.time()
    print("hello")
    end = time.time()
    print(end - start)
    

    这给出了以秒为单位的执行时间。


    从 Python 3.3 开始,另一个选项可能是使用 perf_counter or process_time ,具体取决于您的要求。在 3.3 之前,建议使用 time.clock (感谢 Amber )。但是,它目前已被弃用:

    在 Unix 上,以浮点数形式返回当前处理器时间(以秒为单位)。精度,以及“处理器时间”含义的定义,取决于同名 C 函数的精度。

    在 Windows 上,此函数基于 Win32 函数,以浮点数形式返回自第一次调用此函数以来经过的挂钟秒数 QueryPerformanceCounter() 。分辨率通常优于一微秒。

    自 3.3 版起已弃用 :此功能的行为取决于平台: use perf_counter() or process_time() instead 来获得明确定义的行为。

  • time.time() 会受到 NTP 错误的影响,有人错误地将年份设置为 3023 然后进行更正,闰秒等。因此,这在大多数情况下都能正常工作,但偶尔也会出错,这种错误很难理解,也无法重现。

  • cloc()、perf_counter() 和 process_time() 不包括 sleep()。有时,这正是您想要的,有时则不是。例如,在找出请求缓慢的原因时,您希望在计时数据中显示“我的进程被换出”。

  • @MartinC.Martin:perf_counter()确实包括睡眠期间经过的时间:docs.python.org/3/library/time.html#time.perf_counter

  • 使用 timeit.default_timer 而不是 timeit.timeit 。前者会自动提供你所在平台和 Python 版本上可用的最佳时钟:

    from timeit import default_timer as timer
    
    start = timer()
    # ...
    end = timer()
    print(end - start) # Time in seconds, e.g. 5.38091952400282
    

    timeit.default_timer 被分配给 time.time() 或 time.clock(),具体取决于操作系统。在 Python 3.3+ 上, default_timer 在所有平台上 都是 time.perf_counter() Python - time.clock() 与 time.time() - 准确性?

    参见:

    • 优化代码
    • 如何优化速度
  • 很好的答案 - 使用 timeit 将产生更准确的结果,因为它将自动考虑垃圾收集和操作系统差异等因素。

  • 我在脚本中使用这个,它给出了 62 秒,在另一个完全相同的命令中,我得到了开始、结束和经过时间的值 8357.5812534 8360.9289703 经过时间:8340.9289703 秒,发生了什么??

  • 仅限 Python 3:

    由于 time.clock() 从 Python 3.3 开始已弃用 ,您将需要使用 time.perf_counter() 进行系统范围的计时,或 使用 time.process_time() 进行进程范围的计时,就像您以前使用的方式一样 time.clock() :

    import time
    
    t = time.process_time()
    #do some stuff
    elapsed_time = time.process_time() - t
    

    新功能 process_time 将不包括睡眠期间经过的时间。

  • 文档说 process_time() 返回 CPU 和用户时间的总和。这是否意味着它只返回 # do some stuff 的运行时间(而不是阻塞时间——比如在 IO 上),而不是实际经过的时间?

  • 引用 12

    单位测量时间

    from timeit import default_timer as timer
    from datetime import timedelta
    
    start = timer()
    
    # ....
    # (your code runs here)
    # ...
    
    end = timer()
    print(timedelta(seconds=end-start))
    

    输出

    0:00:01.946339
    
  • 引用 13

    给定一个你想要计时的函数,

    测试.py:

    def foo(): 
        # print "hello"   
        return "hello"
    

    最简单的使用方法 timeit 是从命令行调用它:

    % python -mtimeit -s'import test' 'test.foo()'
    1000000 loops, best of 3: 0.254 usec per loop
    

    不要尝试使用 time.time time.clock (天真地)来比较函数的速度。 它们可能会给出误导性的结果 .

    PS. 不要将打印语句放在要计时的函数中;否则测量的时间将取决于 终端的速度 .

  • 使用上下文管理器来执行此操作很有趣,它可以自动记住进入 with 块时的开始时间,然后在退出块时冻结结束时间。使用一些小技巧,您甚至可以从相同的上下文管理器函数中获取块内的运行时间计数。

    核心库没有这个(但可能应该有)。一旦到位,您可以执行以下操作:

    with elapsed_timer() as elapsed:
        # some lengthy code
        print( "midpoint at %.2f seconds" % elapsed() )  # time so far
        # other lengthy code
    
    print( "all done at %.2f seconds" % elapsed() )
    

    以下是 contextmanager contextmanager

    from contextlib import contextmanager
    from timeit import default_timer
    
    @contextmanager
    def elapsed_timer():
        start = default_timer()
        elapser = lambda: default_timer() - start
        yield lambda: elapser()
        end = default_timer()
        elapser = lambda: end-start
    

    还有一些可运行的演示代码:

    import time
    
    with elapsed_timer() as elapsed:
        time.sleep(1)
        print(elapsed())
        time.sleep(2)
        print(elapsed())
        time.sleep(3)
    

    请注意,根据此函数的设计,返回值 elapsed() 在块退出时被冻结,并且进一步的调用将返回相同的持续时间(在此玩具示例中约为 6 秒)。

  • 其他上下文管理器示例:dabeaz.blogspot.fr/2010/02/…

  • @Jérôme 很好的例子 - 我将其改编为另一个答案 - .com/a/41408510/243392

  • 引用 17

    我的非常相似的独立解决方案:.com/questions/77533604/…

  • 我更喜欢这个。doc timeit 太令人困惑了。

    from datetime import datetime 
    
    start_time = datetime.now() 
    
    # INSERT YOUR CODE 
    
    time_elapsed = datetime.now() - start_time 
    
    print('Time elapsed (hh:mm:ss.ms) {}'.format(time_elapsed))
    

    请注意,这里没有任何格式,我只是将其写入 hh:mm:ss 打印输出,以便人们可以解释 time_elapsed

  • 有人告诉我 timeit 计算 CPU 时间,datetime 是否也考虑了使用的 CPU 时间?它们是同一件事吗?

  • 用这种方式测量经过的时间是有风险的,因为 datetime.now() 可能会在两次调用之间发生变化,原因包括网络时间同步、夏令时切换或用户摆弄时钟。

返回
作者最近主题: