profiler = LineProfiler()
profiled_view = profiler(my_view)
# 你可以模拟一个请求对象,或者从测试数据中获取
request = create_request_somehow()
# 运行被剖析的视图函数
profiled_view(request)
# 输出剖析结果
profiler.print_stats()
```
-
运行你的剖析命令:
在你的Django项目目录中使用manage.py运行刚才创建的命令。python manage.py profile
-
分析剖析结果:
查看命令行输出的剖析结果。line_profiler
会列出每一行代码的执行时间和次数等信息,这样你就可以找到性能瓶颈。
确保在部署到生产环境前移除@profile
装饰器或更改相应的配置,以免引入额外的性能开销。使用line_profiler
来进行性能剖析是一个非常有力的工具,它可以帮助你理解Django视图中每一行代码的性能表现。
line\_profiler跑完结果如下:
Line # Hits Time Per Hit % Time Line Contents
==============================================================
53 def wrapped\_view(\*args, \*\*kwargs):
54 1 1e+10 1e+10 100.0 return view\_func(\*args, \*\*kwargs)
2>使用 `cProfile` 进行性能剖析的方式,可以按照以下步骤进行:
-
命令行:可以直接在命令行中使用
python -m cProfile -o output_file.prof your_script.py
来运行你的脚本,并将剖析结果输出到output_file.prof
文件中。 -
在代码中使用:
- 导入
cProfile
模块。 - 使用
cProfile.run()
或cProfile.runctx()
在代码中直接剖析特定部分。 - 可选使用
pstats
模块来读取并分析剖析数据。
- 导入
示例代码:
import cProfile
import pstats
import io
def function_to_profile():
# 这里放置你想要剖析的代码
pass
# 创建 Profile 实例
pr = cProfile.Profile()
# 开始剖析
pr.enable()
# 运行你想要剖析的函数或代码
function_to_profile()
# 停止剖析
pr.disable()
# 创建数据流以输出剖析结果
s = io.StringIO()
# 创建 pstats 对象,并将剖析数据写入 s 数据流中
ps = pstats.Stats(pr, stream=s).sort_stats('cumulative')
# 打印剖析结果
ps.print_stats()
# 获取打印输出的数据
profiling_result = s.getvalue()
# 打印到控制台,或输出到文件等
print(profiling_result)
如果需要将结果输出到文件并稍后进行分析,可以执行 ps.dump_stats('profile_stats.prof')
,这会将剖析数据保存到 profile_stats.prof
文件。
使用参数 sort_stats()
可以指定输出结果的排序方式,常见的排序参数有 cumulative
(累计时间)、time
(内部时间)等。通过 print_stats()
方法的参数可以控制输出详情的数量(例如 print_stats(10)
只显示前10行结果)。
在使用 cProfile
进行性能剖析时,得到的报告中包含了若干列,每列的含义如下:
-
ncalls: 「调用次数」,表示函数被调用的次数。如果报告显示两个数字,如
3/1
,那么第一个数字表示函数被直接调用的次数,第二个数字表示函数被递归调用的次数。 -
tottime: 「总时间」,表示函数本身在所有调用中消耗的总时间(不包括在其他函数中消耗的时间)。单位通常是秒。
-
percall: 「每次调用平均时间」,它是
tottime
列的时间除以ncalls
列的调用次数。如果ncalls
列显示了两个数字,则这个值表示的是除以第一个数字。 -
cumtime: 「累积时间」,表示函数以及它调用的所有函数在所有调用中消耗的总时间。这是一个更全面的性能指标,因为它包含了当前函数调用其他函数的时间。
-
percall: 这个「每次调用平均时间」与前一栏的
percall
相对应,但它是cumtime
列的时间除以递归调用次数(ncalls
列的第二个数字)。 -
filename:lineno(function): 「文件名、行号和函数名」,提供了函数所在的位置信息,帮助你准确定位代码。
通过这些数据,您可以分析哪些函数耗时最多,哪些函数调用频繁,以及函数调用的性能。这些信息对于优化代码性能非常有用。
最终确认以下内容为性能消耗主要瓶颈:
ncalls tottime percall cumtime percall filename:lineno(function)
104 1.332 0.013 1.332 0.013 {method ‘recv_into’ of ‘_socket.socket’ objects}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)
5%以上前端开发知识点,真正体系化!**
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)