在Python 2.7中获得执行代码块的时间

luc*_*one 67 python profiler python-2.7

我想测量在Python程序中评估代码块所花费的时间,可能在用户CPU时间,系统CPU时间和已用时间之间进行分离.

我知道timeit模块,但是我有很多自编函数,在设置过程中传递它们并不容易.

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

#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
Run Code Online (Sandbox Code Playgroud)

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

And*_*ark 143

要以秒为单位获取经过的时间,您可以使用timeit.default_timer():

import timeit
start_time = timeit.default_timer()
# code you want to evaluate
elapsed = timeit.default_timer() - start_time
Run Code Online (Sandbox Code Playgroud)

timeit.default_timer()是用来代替time.time()或者time.clock()因为它会为任何平台选择具有更高分辨率的定时功能.

  • 将我的答案更改为使用 `timeit.default_timer()`,它将在 `time.time()` 或 `time.clock()` 之间进行选择,具体取决于您使用的平台上哪个具有更高的分辨率。 (4认同)
  • 我已经读过,这不是代码块的最佳方法,只需要几分之一秒的时间就可以运行.另外我认为使用时间模块首选.clock()方法?http://stackoverflow.com/questions/85451/python-time-clock-vs-time-time-accuracy (2认同)

Yar*_*kee 23

我总是使用装饰器为现有函数做一些额外的工作,包括获取执行时间.它是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()
Run Code Online (Sandbox Code Playgroud)

  • @LucaCerone关于装饰有一个很好的解释http://stackoverflow.com/questions/739654/understanding-python-decorators.尝试耐心地阅读它,你会理解装饰. (4认同)
  • 对不起,我还是不知道如何使用装饰器:( (3认同)

Mic*_*ann 10

我发现自己一次又一次地解决了这个问题,所以我终于为它创建了一个.安装时pip install timer_cm.然后:

from time import sleep
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)
Run Code Online (Sandbox Code Playgroud)

输出:

Long task: 3.520s
  Baby steps: 2.518s (71%)
  First step: 1.001s (28%)
Run Code Online (Sandbox Code Playgroud)


mon*_*lof 8

您可以通过Context Manager实现此目的,例如:

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)
Run Code Online (Sandbox Code Playgroud)

使用示例:

with _log_time_usage("sleep 1: "):
    time.sleep(1)
Run Code Online (Sandbox Code Playgroud)