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 ... |
左侧将包含您的函数。
- 正在获取这些错误--->file"/usr/lib/python3.4/run py.py",第170行,在"运行"模块中,作为"主"文件,mod_spec)文件"/usr/lib/python3.4/runpy.py",第85行,在"运行"代码执行(代码,运行全局)文件"/usr/lib/python3.4/profile.py",第589行,在main()文件"/usr/lib/python3.4/profile.py",第575行,在主代码中=编译(fp.read(),progname,'exec')文件"/home/****/eclipseworkspace/abcd.py",第20行打印"%r(%r,%r)%2.2f秒"%"
- 如果你只运行python file.py,会发生什么?
- 还有,江户十一〔五〕说什么?它应该从"python 2"开始。
- 作为Ubuntu14版本的一部分,我有2.7和3.4.0。所以我把默认版本改为python 3.4.0
- 对,所以您需要运行python2 -m profile -s time file.py,因为您的代码是python 2。print '%r (%r, %r) %2.2f sec'是python 2语法。
- 我出错了……回溯(最近一次调用last):file"/usr/lib/python2.7/run py.py",line 162,in run module ou as main"main",fname,loader,pkg name)file"/usr/lib/python2.7/runpy.py",line 72,in run code exec code in run globals file"/usr/lib/python2.7/cprofile.py",line 199,inmain()file"/usr/lib/python2.ne 192,在主runctx(code,globs,none,options.outfile,options.sort)文件"/usr/lib/python2.7/cprofile.py"中,第49行,在runctx prof=prof.runctx中(statement,globals,locals)
- 让我们在聊天中继续讨论。
首先,我建议使用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")。
- 对不起,我以前从来没有这样做过。所以,我必须在程序开始时添加这个度量时间函数,并在我的每个函数之前添加@measure时间?我说的对吗?
- 是否可以对整个程序使用profile或timeit?这是给了我每个函数所花费的时间,还是我必须用它们来找出一个函数所花费的时间?
- 您需要在您的.py中定义函数,并在查找这些运行时的任何函数之前使用@measure_time!
- 最好使用配置文件,并且可以将其用于所有代码
- 要分析接受单个参数的函数,可以执行以下操作:导入cprofile import re cProfile.run('re.compile("foo|bar")')。
- 阅读wiki上的更多详细信息:docs.python.org/2/library/profile.html The python profilers
- 问题是,我正在寻找一些东西,可以给我模块中每个函数所花费的时间,比如func1-所花费的时间,func2-所花费的时间。这样地。。这就是为什么我试图理解我是否可以使用profiler或timeit来实现这一点。因为profiler或timeit一次查找每个函数,而不是一次查找整个模块。
- 好吧,我在回答中写到,你可以用re.comple来添加你的函数名。