关于性能:每个函数的python时间度量

python time measure for every function

本问题已经有最佳答案,请猛点这里访问。

我刚刚用python编写了我的第一个程序,在一个模块中编写了我的所有函数,我刚从命令行通过将输入文件作为参数来执行它,它就工作了。但是当我给一个大数据集时,我的程序会持续运行一段时间。现在,我的下一步是找出哪个函数在我的模块中占用了更多的时间。我可以得到整个程序所花费的时间,但是我需要分别处理每个函数。

我试图理解python中的timeit和profile模块,但是根据我的理解,它们给出了特定函数所花费的时间。有没有一种方法可以知道我的模块中每个函数作为统计数据所花费的时间(一次全部)?

事先谢谢。


在终点站,跑

1
python -m profile -s time file.py

1
python -m cProfile -s time file.py

第二个可以更快,而且永远不会更糟。

这将提供如下内容:

1
2
3
4
5
6
7
8
   Ordered by: internal time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
       39    0.132    0.003    0.139    0.004 :0(load_dynamic)
      239    0.097    0.000    0.097    0.000 :0(loads)
    541/1    0.083    0.000    3.556    3.556 :0(exec)
       30    0.082    0.003    0.082    0.003 :0(statusBar)
                        ... etc ...

左侧将包含您的函数。


首先,我建议使用profilers模块或timeit来实现这一目标。timeit提供了一种简单的方法来计时少量的python代码!

要分析接受单个参数的函数,可以执行以下操作:

1
2
3
import cProfile
import re
cProfile.run('re.compile("foo|bar")')

此外,您还可以使用这样的装饰器来测量专用方法的执行时间:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import time                                                

def measure_time(f):

  def timed(*args, **kw):
    ts = time.time()
    result = f(*args, **kw)
    te = time.time()

    print '%r (%r, %r) %2.2f sec' % \
          (f.__name__, args, kw, te-ts)
    return result

return timed

您可以这样使用它:

1
2
3
  @measure_time
  def foo():
        #content of function

注意,f.__name__返回函数名!(在本例中为"foo")。