如何在Python中自动测量函数执行时间

34 投票
3 回答
24446 浏览
提问于 2025-04-15 19:09

我需要一个基类,这个基类将用来让其他类继承,我想要测量这些类中函数的执行时间。

所以我不想要像这样:

class Worker():
    def doSomething(self):
        start = time.time()
        ... do something
        elapsed = (time.time() - start)
        print "doSomething() took ", elapsed, " time to finish"

#outputs: doSomething() took XX time to finish

我想要的是像这样:

class Worker(BaseClass):
    def doSomething(self):
        ... do something

#outputs the same: doSomething() took XX time to finish

所以这个基类需要负责测量时间。

3 个回答

6

还有一个叫做 timeit 的工具,它是Python自带的库,使用起来非常简单。记住:别重复造轮子!

10

你有没有查看过“profile”模块?

也就是说,你确定需要自己做一个特别的框架,而不是直接用这个语言自带的性能分析工具吗?

你也可以在网上搜索“python hotshot”,看看有没有类似的解决方案。

65

一种实现这个功能的方法是使用装饰器,具体可以参考这个关于装饰器的PEP文档,还有这篇关于装饰器的系列教程文章。下面是一个可以满足你需求的例子。

from functools import wraps
from time import time

def timed(f):
  @wraps(f)
  def wrapper(*args, **kwds):
    start = time()
    result = f(*args, **kwds)
    elapsed = time() - start
    print "%s took %d time to finish" % (f.__name__, elapsed)
    return result
  return wrapper

这是它使用的一个例子

@timed
def somefunction(countto):
  for i in xrange(countto):
    pass
  return "Done"

为了展示它是如何工作的,我在Python的命令行中调用了这个函数:

>>> timedec.somefunction(10000000)
somefunction took 0 time to finish
'Done'
>>> timedec.somefunction(100000000)
somefunction took 2 time to finish
'Done'
>>> timedec.somefunction(1000000000)
somefunction took 22 time to finish
'Done'

撰写回答