使用Profile或cProfile有什么好处
与这样的东西相比:
def time_this(func):
@functools.wraps(func)
def what_time_is_it(*args, **kwargs):
start_time = time.clock()
print 'STARTING TIME: %f' % start_time
result = func(*args, **kwargs)
end_time = time.clock()
print 'ENDING TIME: %f' % end_time
print 'TOTAL TIME: %f' % (end_time - start_time)
return result
return what_time_is_it
我之所以这样问,是因为像这样写描述符对我来说似乎更简单、更清晰。我知道profile/cprofile是用来估算字节码编译时间的,并且会把这些时间从运行时间中减去,所以更具体一点。
我想知道:
- a) 编译时间什么时候变得足够重要,以至于这些差异会影响结果?
- b) 我该如何编写自己的分析工具,以考虑编译时间?
2 个回答
1
Profile和cProfile跟估算编译时间没有任何关系。它们是用来估算运行时间的。
编译时间并不是性能问题。如果你不想每次运行代码都编译一次,可以用import
把它导入,这样它会被保存为.pyc
文件,只有在你修改代码时才会重新编译。其实,代码编译需要的时间根本不重要(因为它非常快),因为每次运行时并不需要重新编译。
如果你想测量编译时间,可以使用compiler包。
简单来说:
from timeit import timeit
print timeit('compiler.compileFile(' + filename + ')', 'import compiler', number=100)
这段代码会打印出编译filename
100次所需的时间。
如果在func
里面,你往一些列表里添加东西,做一些加法,查找字典里的变量,profile
会告诉你这些操作各自花了多长时间。
你的版本并不会告诉你这些信息。而且它也不太准确——你得到的时间取决于查找time
的clock
属性和调用它所花的时间。
如果你想测量一小段代码的执行时间,可以使用timeit
。如果你想要对代码进行性能分析,可以用profile
或cProfile
。如果你想知道的是任意代码的运行时间,但不关心哪些部分运行得慢,那么你的版本是可以的,只要代码的运行时间不是几毫秒。
5
Profile的速度比cProfile慢,但它支持多线程。
cProfile的速度要快很多,但据我所知,它不能对多线程进行分析(只能分析主线程,其他线程会被忽略)。