python profiling
如果一个函数运行很慢,可以通过以下方法来找出具体哪个函数拖慢了程序。
- 使用cprofile分析
cprofile可以很容易的分析一个函数以及其子函数的cpu耗时情况,一般可以优先选择这个方法,它可以定位到代码行,但是不会给出函数的调用关系。
import cProfile
import pstatsdef parent_func():child_func()def child_func():helper()def helper():pass# 运行分析
profiler = cProfile.Profile()
profiler.enable()
parent_func()
profiler.disable()# 输出报告
stats = pstats.Stats(profiler)
stats.sort_stats("cumtime") # 按总耗时排序
stats.print_stats()
- 使用line_profiler做性能分析
这个库的优点是列出函数每一行的耗时,但是缺点是要做profiling的函数需要手动加入。
from line_profiler import LineProfilerdef parent_func():child_func()def child_func():helper()def helper():pass# 动态分析所有函数
profiler = LineProfiler()
profiler.add_function(parent_func)
profiler.add_function(child_func)
profiler.add_function(helper)# 运行并输出报告
profiler.runcall(parent_func)
profiler.print_stats()
对于教简单的代码可以用lineprofile的装饰器装饰,看起来更优雅。
from line_profiler import profile@profile
def main():for _ in range(1000):helper() # 子函数调用@profile
def helper(): # 子函数单独装饰x = [i**2 for i in range(100)]if __name__ == "__main__":main()