在Python 2.7中获取一段代码的执行时间

我想测量在Python程序中评估代码块所用的时间,可能会在用户cpu时间,系统cpu时间和经过时间之间分离。

我知道timeit模块,但是我有许多自写function,在安装过程中传递它们并不是很容易。

我宁愿有一些可以使用的东西,如:

 #up to here I have done something.... start_counting() #or whatever command used to mark that I want to measure #the time elapsed in the next rows # code I want to evaluate user,system,elapsed = stop_counting() #or whatever command says: #stop the timer and return the times 

用户和系统的CPU时间并不是必需的(尽pipe我想测量它们),但是对于经过的时间,我希望能够做这样的事情,而不是使用复杂的命令或模块。

要以秒为单位获得stream逝的时间,可以使用timeit.default_timer()

 import timeit start_time = timeit.default_timer() # code you want to evaluate elapsed = timeit.default_timer() - start_time 

timeit.default_timer()而不是time.time()time.clock()因为它将select具有较高分辨率的定时function。

我总是使用装饰器为现有的function做一些额外的工作,包括获得执行时间。 这是pythonic和简单的。

 import time def time_usage(func): def wrapper(*args, **kwargs): beg_ts = time.time() retval = func(*args, **kwargs) end_ts = time.time() print("elapsed time: %f" % (end_ts - beg_ts)) return retval return wrapper @time_usage def test(): for i in xrange(0, 10000): pass if __name__ == "__main__": test() 

您可以通过上下文pipe理器来实现,例如:

 from contextlib import contextmanager import time import logging @contextmanager def _log_time_usage(prefix=""): '''log the time usage in a code block prefix: the prefix text to show ''' start = time.time() try: yield finally: end = time.time() elapsed_seconds = float("%.2f" % (end - start)) logging.debug('%s: elapsed seconds: %s', prefix, elapsed_seconds) 

使用示例:

 with _log_time_usage("sleep 1: "): time.sleep(1) 

我发现自己一次又一次地解决了这个问题,于是我终于为它创build了一个库 。 用pip install timer_cm 。 然后:

 from timer_cm import timer with Timer('Long task') as timer: with timer.child('First step'): sleep(1) for _ in range(5): with timer.child('Baby steps'): sleep(.5) 

输出:

 Long task: 3.520s Baby steps: 2.518s (71%) First step: 1.001s (28%)