首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python性能分析:cProfile模块使用教程

作为Python开发者,代码写出来能跑就完事了?玩玩具项目或许够了,但真要整点大活,性能分析可一点都马虎不得。我在工作中就见过不少程序,看着挺正常,实际运行起来慢得像蜗牛。今儿咱就好好说说Python自带的性能分析利器 -cProfile模块。

认识cProfile

cProfile是Python内置的性能分析模块,它能帮你找出程序中最耗时的部分。不像print大法那样粗糙,它能精确记录每个函数的调用次数、执行时间,还能分析函数调用关系。

看个栗子:

1def fibonacci(n):

2 if n < 2:

3 return n

4 return fibonacci(n-1) + fibonacci(n-2)

6def calculate_fibonacci():

7 result = [fibonacci(n) for n in range(30)]

8 return result

10# 使用cProfile分析性能

11import cProfile

12profiler = cProfile.Profile()

13profiler.run('calculate_fibonacci()')

14profiler.print_stats()

运行这段代码,马上就能看到每个函数的详细统计信息,包括调用次数、累计时间等。

小贴士:

cProfile是Python内置模块,不需要额外安装

相比print加时间戳的方式,能节省不少调试时间

生产环境使用时记得考虑性能开销

深入理解统计数据

cProfile输出的数据看着有点懵?来,给你翻译翻译:

ncalls:函数被调用的次数

tottime:函数内部消耗的总时间(不包括调用其他函数的时间)

percall:平均每次调用消耗的时间

cumtime:函数消耗的总时间(包括调用其他函数的时间)

filename:lineno:函数所在的文件和行号

import time

def slow_function():time.sleep(1)

def fast_function():return sum(range(1000))

def main():slow_function() fast_function()

import cProfile cProfile.run(‘main()’)

性能分析实战技巧

光看数据没用,得知道怎么分析。我总结了几个实用技巧:

按时间排序:

import cProfile import pstats

profiler = cProfile.Profile() profiler.run(‘main()’)

stats = pstats.Stats(profiler) stats.sort_stats(‘cumtime’).print_stats()

保存分析结果:

stats.dump_stats(‘program.prof’)

小贴士:

重点关注cumtime最大的几个函数

注意观察重复调用次数特别多的函数

别忘了检查那些调用次数不多但单次耗时很长的函数

性能优化实战

找到性能瓶颈后,就该优化了。拿刚才的斐波那契数列来说:

1def fibonacci_optimized(n, cache={}):

2 # 加个缓存立马提速

3 if n in cache:

4 return cache[n]

5 if n < 2:

6 return n

7 cache[n] = fibonacci_optimized(n-1) + fibonacci_optimized(n-2)

8 return cache[n]

用cProfile对比一下优化前后的性能,差别立竿见影。

小贴士:

优化前记得先用cProfile收集基准数据

每次只改一处,方便对比效果

别忘了验证优化后的代码是否还能正常工作

经过这么多年Python开发经验,我发现性能优化最容易走进一个坑:过早优化。与其漫无目的地优化,不如先用cProfile找到真正的瓶颈。毕竟提升10%最慢的代码,比优化90%其他代码来得实在。

记住一点,性能分析不是一锤子买卖,而是贯穿整个开发过程的必备工具。定期跑跑性能分析,能帮你及早发现并解决性能问题,代码才能越跑越快。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OssGCx63GIIEQBD7YAhUDGcQ0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券