【问题标题】:Python speed testing - Time Difference - millisecondsPython速度测试 - 时差 - 毫秒
【发布时间】:2010-10-20 11:05:16
【问题描述】:

在 Python 中比较 2 次以加快测试一段代码的正确方法是什么?我尝试阅读 API 文档。我不确定我是否理解 timedelta。

到目前为止,我有这个代码:

from datetime import datetime

tstart = datetime.now()
print t1

# code to speed test

tend = datetime.now()
print t2
# what am I missing?
# I'd like to print the time diff here

【问题讨论】:

  • 为什么不打印 t2-t1?是什么阻止你做减法?
  • 猜猜,我有“不可能那么容易”的时刻。

标签: python datetime time time-measurement


【解决方案1】:

您可以简单地打印差异:

print tend - tstart

【讨论】:

    【解决方案2】:

    我不是 Python 程序员,但I do know how to use Google 是我发现的:您使用“-”运算符。完成您的代码:

    from datetime import datetime
    
    tstart = datetime.now()
    
    # code to speed test
    
    tend = datetime.now()
    print tend - tstart
    

    此外,您似乎可以使用 strftime() 函数来格式化时间跨度计算,以便渲染时间,但让您开心。

    【讨论】:

    • "but I do know how to use Google" -- 显然,你不知道如何使用 Stack Overflow,因为这个网站的全部目的是让人们提出和回答编程问题正确且直截了当,而不是对“你可以用 Goggled 代替”的方式嗤之以鼻。
    【解决方案3】:

    以下代码应显示时间详细信息...

    from datetime import datetime
    
    tstart = datetime.now()
    
    # code to speed test
    
    tend = datetime.now()
    print tend - tstart
    

    【讨论】:

      【解决方案4】:

      time.time() / datetime 适合快速使用,但并不总是 100% 精确。出于这个原因,我喜欢使用 std lib profilers 之一(尤其是热门)来找出什么是什么。

      【讨论】:

        【解决方案5】:

        datetime.timedelta 只是两个日期时间之间的差异......所以它就像一段时间,以天/秒/微秒为单位

        >>> import datetime
        >>> a = datetime.datetime.now()
        >>> b = datetime.datetime.now()
        >>> c = b - a
        
        >>> c
        datetime.timedelta(0, 4, 316543)
        >>> c.days
        0
        >>> c.seconds
        4
        >>> c.microseconds
        316543
        

        注意c.microseconds 只返回时间增量的微秒部分!出于计时目的,请始终使用c.total_seconds()

        您可以使用 datetime.timedelta 进行各种数学运算,例如:

        >>> c / 10
        datetime.timedelta(0, 0, 431654)
        

        虽然查看 CPU 时间而不是挂钟时间可能更有用...尽管这取决于操作系统...在类 Unix 系统下,请查看“时间”命令。

        【讨论】:

        • 任何有兴趣获得总分钟数的人都可以在这种情况下使用int(c.total_seconds() / 60)
        • page for the timeit module 表示该模块“避免了许多用于测量执行时间的常见陷阱”。这种方法(使用 datetime.now)是否存在这些陷阱?
        • @kuzzooroo 是的,是的!最好使用 timeit 而不是这种方法!例如,我在一个大型 python 项目中进行了测试,当使用此方法进行测量时,会产生假定的 0.25 秒运行时间。实际上,根据timeit,该函数的运行时间实际上是30秒!
        • 这不适用于精确计时,因为 datetime 不是单调时钟
        • 如果您的 Python 程序通过 CPython 调用 C++ 代码,这似乎测量了错误的时间。
        【解决方案6】:

        你也可以使用:

        import time
        
        start = time.clock()
        do_something()
        end = time.clock()
        print "%.2gs" % (end-start)
        

        或者您可以使用python profilers

        【讨论】:

        • 当使用start = time.clock()时,它会打印DeprecationWarning: time.clock has been deprecated in Python 3.3 and will be removed from Python 3.8: use time.perf_counter or time.process_time instead
        【解决方案7】:

        您可能想查看profile 模块。您将更好地了解减速的位置,并且您的大部分工作将完全自动化。

        【讨论】:

        • 好主意!谢谢。
        【解决方案8】:

        您可能想改用the timeit module

        【讨论】:

          【解决方案9】:

          您可以像这样使用 timeit 来测试名为 module.py 的脚本

          $ python -mtimeit -s 'import module'
          

          【讨论】:

            【解决方案10】:

            我知道这已经晚了,但我真的很喜欢使用:

            import time
            start = time.time()
            
            ##### your timed code here ... #####
            
            print "Process time: " + (time.time() - start)
            

            time.time() 为您提供自纪元以来的秒数。因为这是一个以秒为单位的标准化时间,您可以简单地从结束时间中减去开始时间来获得处理时间(以秒为单位)。 time.clock() 非常适合进行基准测试,但如果你想知道你的过程花了多长时间,我发现它有点用处。例如,说“我的进程需要 10 秒”比说“我的进程需要 10 个处理器时钟单元”更直观

            >>> start = time.time(); sum([each**8.3 for each in range(1,100000)]) ; print (time.time() - start)
            3.4001404476250935e+45
            0.0637760162354
            >>> start = time.clock(); sum([each**8.3 for each in range(1,100000)]) ; print (time.clock() - start)
            3.4001404476250935e+45
            0.05
            

            在上面的第一个示例中,time.clock() 显示的时间为 0.05,而 time.time() 显示的时间为 0.06377

            >>> start = time.clock(); time.sleep(1) ; print "process time: " + (time.clock() - start)
            process time: 0.0
            >>> start = time.time(); time.sleep(1) ; print "process time: " + (time.time() - start)
            process time: 1.00111794472
            

            在第二个示例中,即使进程休眠了一秒钟,处理器时间也以某种方式显示为“0”。 time.time() 正确显示了 1 秒多一点。

            【讨论】:

            • NameError: name 'time' is not defined
            • 你需要import time声明
            【解决方案11】:

            从 Python 2.7 开始就有 timedelta.total_seconds() 方法。因此,要获取经过的毫秒数:

            >>> import datetime
            >>> a = datetime.datetime.now()
            >>> b = datetime.datetime.now()
            >>> delta = b - a
            >>> print delta
            0:00:05.077263
            >>> int(delta.total_seconds() * 1000) # milliseconds
            5077
            

            【讨论】:

            • 如何以毫秒为单位准确显示?
            • @Buffalo - 这是准确的
            【解决方案12】:

            这是一个模仿 Matlab/Octave 的tictoc 函数的自定义函数。

            使用示例:

            time_var = time_me(); # get a variable with the current timestamp
            
            ... run operation ...
            
            time_me(time_var); # print the time difference (e.g. '5 seconds 821.12314 ms')
            

            功能:

            def time_me(*arg):
                if len(arg) != 0: 
                    elapsedTime = time.time() - arg[0];
                    #print(elapsedTime);
                    hours = math.floor(elapsedTime / (60*60))
                    elapsedTime = elapsedTime - hours * (60*60);
                    minutes = math.floor(elapsedTime / 60)
                    elapsedTime = elapsedTime - minutes * (60);
                    seconds = math.floor(elapsedTime);
                    elapsedTime = elapsedTime - seconds;
                    ms = elapsedTime * 1000;
                    if(hours != 0):
                        print ("%d hours %d minutes %d seconds" % (hours, minutes, seconds)) 
                    elif(minutes != 0):
                        print ("%d minutes %d seconds" % (minutes, seconds))
                    else :
                        print ("%d seconds %f ms" % (seconds, ms))
                else:
                    #print ('does not exist. here you go.');
                    return time.time()
            

            【讨论】:

            • Traceback(最近一次调用最后一次):文件“redis-get-response.py”,第 22 行,在 time_var = time_me(); # 获取具有当前时间戳的变量 File "redis-get-response.py", line 20, in time_me return time.time() NameError: name 'time' is not defined
            【解决方案13】:

            箭头:Python 更好的日期和时间

            import arrow
            start_time = arrow.utcnow()
            end_time = arrow.utcnow()
            (end_time - start_time).total_seconds()  # senconds
            (end_time - start_time).total_seconds() * 1000  # milliseconds
            

            【讨论】:

              【解决方案14】:
              start = datetime.now() 
              
              #code for which response time need to be measured.
              
              end = datetime.now()
              dif = end - start
              dif_micro = dif.microseconds # time in microseconds
              dif_millis = dif.microseconds / 1000 # time in millisseconds
              

              【讨论】:

              • 虽然此代码可能会为问题提供解决方案,但最好添加有关其工作原理/方式的上下文。这可以帮助未来的用户学习并最终将这些知识应用到他们自己的代码中。解释代码时,您也可能会得到用户的积极反馈/赞成。
              【解决方案15】:

              如果有人需要这样的东西来分析日志条目之间的延迟,例如......等等。

              def get_time_diff_between_timestruct_tuples(timestruct_tuples):
                  """
                  expecting input like:
                  [(0, datetime.datetime(2021, 10, 27, 16, 6, 8, 590892)),
                  (1, datetime.datetime(2021, 10, 27, 16, 6, 8, 591833)),
                  (2, datetime.datetime(2021, 10, 27, 16, 6, 9, 434053)),
                  (3, datetime.datetime(2021, 10, 27, 16, 6, 9, 878021)), ...]
                  
                  output like:
                  [0.941, 0.84222, 0.443968, ...]
                  """
                  
                  def seconds_mms_diff(t0, t1):
                      diff = t1 - t0
                      s = diff.seconds
                      mms = diff.microseconds
                      return float(f"{s}.{mms}")
                  
                  timediffs = []
                  init = timestruct_tuples[0][1]
                  idx = 0
                  while idx < (len(timestruct_tuples)-1):
                      timediffs.append(seconds_mms_diff(init, timestruct_tuples[idx+1][1]))
                      idx += 1
                      init = timestruct_tuples[idx][1]
                  return timediffs
              

              【讨论】:

                【解决方案16】:

                您需要改用time.time(),它会以高精度输出unix时间。

                使用此代码:

                from time import time
                
                tstart = time()
                doSomething()
                tend = time()
                difference = tend - tstart
                print("The doSomething function took {} seconds to execute".format(difference))
                

                【讨论】:

                  猜你喜欢
                  • 2022-09-13
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-11-13
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多