如何测量python中代码行之间的时间?

alv*_*vas 64 python time profiling measure

所以在Java中,我们可以做如何测量函数执行所花费的时间

但它是如何在python中完成的?要测量代码行之间的时间开始和结束时间?这样做的东西:

import some_time_library

starttime = some_time_library.some_module()
code_tobe_measured() 
endtime = some_time_library.some_module()

time_taken = endtime - starttime
Run Code Online (Sandbox Code Playgroud)

Yev*_*kiy 105

你可以用time.process_time()它.

import time
start = time.process_time()
# your code here    
print(time.process_time() - start)
Run Code Online (Sandbox Code Playgroud)

第一个调用打开计时器,第二个调用表示已经过了多少秒.

还有更好的分析工具,如time.clock()timeit,但是这一次将测量的时间,这是你在问什么

  • 这不是你如何使用`time.clock()`,`time.clock()`测量Unix上的CPU时间,而是测量Windows上的时间.最好使用`time.time()`,其中行为不随操作系统而变化.http://stackoverflow.com/questions/85451/python-time-clock-vs-time-time-accuracy (50认同)
  • 很好的观察,@ Tim.然而,同一个问题的另一篇文章引用了time.clock()上的python doc,"这是用于对Python或时序算法进行基准测试的函数".我想这是关于你真正想要衡量的问题. (4认同)
  • `DeprecationWarning:time.clock在Python 3.3中已被弃用,将从Python 3.8中删除:改为使用time.perf_counter或time.process_time。 (4认同)
  • 嗯...不知道我做错了什么。我将 `# your code here` 替换为 `time.sleep(10)` 并得到了 0.0 秒。添加“for i in range(10000):/pass”会产生相同的结果。在我尝试的任何情况下,“time.process_time()”总是返回相同的数字。我使用“time.perf_counter()”得到了预期的结果 (3认同)

Aks*_*jan 40

您还可以使用import time库:

start = time.time()
   #your code
end = time.time()
time_taken = end - start
print('Time: ',time_taken)
Run Code Online (Sandbox Code Playgroud)

  • @AnumoySutradhar 不是真的,因为它是从一个纪元中减去一个纪元,你会得到两个时间之间的时间差。 (5认同)
  • @Hayat - 此方法以浮点数形式返回时间,以 UTC 纪元以来的秒数表示。[https://docs.python.org/3/library/time.html] (3认同)

Jus*_*tas 15

在小型便利类的帮助下,您可以测量缩进行所花费的时间,如下所示:

with CodeTimer():
   line_to_measure()
   another_line()
   # etc...
Run Code Online (Sandbox Code Playgroud)

在缩进行完成执行后将显示以下内容:

Code block took: x.xxx ms
Run Code Online (Sandbox Code Playgroud)

上述类的代码:

import timeit

class CodeTimer:
    def __init__(self, name=None):
        self.name = " '"  + name + "'" if name else ''

    def __enter__(self):
        self.start = timeit.default_timer()

    def __exit__(self, exc_type, exc_value, traceback):
        self.took = (timeit.default_timer() - self.start) * 1000.0
        print('Code block' + self.name + ' took: ' + str(self.took) + ' ms')
Run Code Online (Sandbox Code Playgroud)

然后,您可以命名要测量的代码块:

with CodeTimer('loop 1'):
   for i in range(100000):
      pass

with CodeTimer('loop 2'):
   for i in range(100000):
      pass

Code block 'loop 1' took: 4.991 ms
Code block 'loop 2' took: 3.666 ms
Run Code Online (Sandbox Code Playgroud)

嵌套它们:

with CodeTimer('Outer'):
   for i in range(100000):
      pass

   with CodeTimer('Inner'):
      for i in range(100000):
         pass

   for i in range(100000):
      pass

Code block 'Inner' took: 2.382 ms
Code block 'Outer' took: 10.466 ms
Run Code Online (Sandbox Code Playgroud)


Say*_*ane 15

我总是喜欢以小时、分钟和秒 (%H:%M:%S) 格式检查时间:

from datetime import datetime
start = datetime.now()
# your code
end = datetime.now()
time_taken = end - start
print('Time: ',time_taken) 
Run Code Online (Sandbox Code Playgroud)

输出:

Time:  0:00:00.000019
Run Code Online (Sandbox Code Playgroud)


Alp*_*ren 11

将代码放在函数中,然后使用装饰器进行计时是另一种选择。(来源) 这种方法的优点是你定义了一次计时器,并为每个函数添加一个简单的附加行来使用它。

首先,定义timer装饰器:

import functools
import time

def timer(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        start_time = time.perf_counter()
        value = func(*args, **kwargs)
        end_time = time.perf_counter()
        run_time = end_time - start_time
        print("Finished {} in {} secs".format(repr(func.__name__), round(run_time, 3)))
        return value

    return wrapper
Run Code Online (Sandbox Code Playgroud)

然后,在定义函数时使用装饰器:

@timer
def doubled_and_add(num):
    res = sum([i*2 for i in range(num)])
    print("Result : {}".format(res))
Run Code Online (Sandbox Code Playgroud)

咱们试试吧:

doubled_and_add(100000)
doubled_and_add(1000000)
Run Code Online (Sandbox Code Playgroud)

输出:

Result : 9999900000
Finished 'doubled_and_add' in 0.0119 secs
Result : 999999000000
Finished 'doubled_and_add' in 0.0897 secs
Run Code Online (Sandbox Code Playgroud)

注意:我不确定为什么要使用time.perf_counter而不是time.time. 欢迎提出意见。


Mar*_*ius 5

我一直在寻找一种如何用最少的代码输出格式化时间的方法,所以这是我的解决方案。许多人无论如何都使用 Pandas,因此在某些情况下,这可以避免额外的库导入。

import pandas as pd
start = pd.Timestamp.now()
# code
print(pd.Timestamp.now()-start)
Run Code Online (Sandbox Code Playgroud)

输出:

0 days 00:05:32.541600
Run Code Online (Sandbox Code Playgroud)

如果时间精度不是最重要的,我建议使用它,否则使用time库:

%timeit pd.Timestamp.now() 每个循环输出 3.29 µs ± 214 ns

%timeit time.time() 每个循环输出 154 ns ± 13.3 ns