使用Profile或cProfile有什么好处

2 投票
2 回答
2238 浏览
提问于 2025-04-17 00:00

与这样的东西相比:

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会告诉你这些操作各自花了多长时间。

你的版本并不会告诉你这些信息。而且它也不太准确——你得到的时间取决于查找timeclock属性和调用它所花的时间。

如果你想测量一小段代码的执行时间,可以使用timeit。如果你想要对代码进行性能分析,可以用profilecProfile。如果你想知道的是任意代码的运行时间,但不关心哪些部分运行得慢,那么你的版本是可以的,只要代码的运行时间不是几毫秒

5

Profile的速度比cProfile慢,但它支持多线程。

cProfile的速度要快很多,但据我所知,它不能对多线程进行分析(只能分析主线程,其他线程会被忽略)。

撰写回答