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

时间:2013-01-22 05:31:41

标签: python time profiling measure

所以在Java中,我们可以How to measure time taken by a function to execute

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

import some_time_library

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

time_taken = endtime - starttime

6 个答案:

答案 0 :(得分:80)

您可以使用time.clock

import time
start = time.clock()
#your code here    
print time.clock() - start

第一次调用打开计时器,第二次调用告知已经过了多少秒。

有更好的分析工具,例如timeitprofile,但是这个会测量时间,这就是你要问的问题

答案 1 :(得分:16)

您还可以使用import time库:

start = time.time()
   #your code
end = time.time()
time_taken = end - start
print('Time: ',time_taken)

答案 2 :(得分:10)

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

with CodeTimer():
   line_to_measure()
   another_line()
   # etc...

缩进行执行完毕后,将显示以下内容:

Code block took: x.xxx ms

更新:您现在可以先依次使用pip install linetimerfrom linetimer import CodeTimer来获取课程。参见this GitHub project

以上类别的代码:

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')

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

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

然后嵌套

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

关于timeit.default_timer(),它使用基于操作系统和Python版本的最佳计时器,请参见this answer

答案 3 :(得分:3)

将代码放入函数中,然后使用装饰器进行计时是另一种选择。 (Source)这种方法的优点是您只需定义一次计时器,然后对每个功能使用简单的附加行

首先,定义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

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

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

让我们尝试一下:

doubled_and_add(100000)
doubled_and_add(1000000)

输出:

Result : 9999900000
Finished 'doubled_and_add' in 0.0119 secs
Result : 999999000000
Finished 'doubled_and_add' in 0.0897 secs

注意:我不确定为什么要使用time.perf_counter而不是time.time。欢迎发表评论。

答案 4 :(得分:1)

我一直在寻找一种如何以最少的代码输出格式化时间的方法,因此这是我的解决方案。无论如何,许多人都使用熊猫,因此在某些情况下,可以从其他库导入中节省资源。

import pandas as pd
start = pd.Timestamp.now()
# code
print(pd.Timestamp.now()-start)

输出:

0 days 00:05:32.541600

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

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

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

答案 5 :(得分:0)

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

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

输出:

Time:  0:00:00.000019