Python中性能分析利器pyinstrument详细讲解
作者:曲鸟 发布时间:2021-02-15 10:46:51
一、前言
程序的性能也是非常关键的指标,很多时候你的代码跑的快,更能够体现你的技术。最近发现很多小伙伴在性能分析的过程中都是手动打印运行时间的方式来统计代码耗时的:
import datetime
start=datetime.datetime.now()
b=[i for i in range(10000000)] # 生成长度为一千万的列表
end=datetime.datetime.now()
print(end-start)
输出结果
0:00:00.377766
这种方法使用很快捷,但需要统计每行代码的执行时间,生成可视化的报告等更完善的性能分析时就有点力不从心了。这个时候可以使用python的第三方库Pyinstrument
来进行性能分析。
二、Pyinstrument使用
Pyinstrument 是一个 Python 分析器。分析器是一种帮助您优化代码的工具 - 使其更快。要获得最大的速度提升。
Pyinstrument 官方文档:pyinstrument
Pyinstrument 安装:
pip install pyinstrument
1. 举例
对于最开始我们举的例子,使用Pyinstrument实现的代码如下:
文末添加个人VX,获取资料和免费答疑
from pyinstrument import Profiler
profiler=Profiler()
profiler.start()
b=[i for i in range(10000000)]# 生成长度为一千万的列表
profiler.stop()
profiler.print()
输出结果
_ ._ __/__ _ _ _ _ _/_ Recorded: 10:39:54 Samples: 1
/_//_/// /_\ / //_// / //_'/ // Duration: 0.385 CPU time: 0.391
/ _/ v4.1.1
Program: D:/code/server/aitestdemo/test2.py
0.385 <module> test2.py:2 #执行总耗时
└─ 0.385 <listcomp> test2.py:7 #单行代码耗时
打印的信息包含了记录时间、线程数、总耗时、单行代码耗时、CPU执行时间等信息。
在多行代码分析的情况下的使用效果(分别统计生成一千万长度、一亿长度、两亿长度的列表耗时):
from pyinstrument import Profiler
profiler = Profiler()
profiler.start()
a = [i for i in range(10000000)] # 生成长度为一千万的列表
b = [i for i in range(100000000)] # 生成长度为一亿的列表
c = [i for i in range(200000000)] # 生成长度为十亿的列表
profiler.stop()
profiler.print()
输出结果
Program: D:/code/server/aitestdemo/test2.py
16.686 <module> test2.py:1
├─ 12.178 <listcomp> test2.py:9
├─ 4.147 <listcomp> test2.py:8
└─ 0.358 <listcomp> test2.py:7
2. Pyinstrument分析django代码
使用Pyinstrument分析 Django 代码非常简单,只需要在 Django 的配置文件settings.py
的 MIDDLEWARE
中添加如下配置:
MIDDLEWARE = [
...
'pyinstrument.middleware.ProfilerMiddleware',
...
]
然后就可以在 url 上加一个参数 profile 就可以:
Pyinstrument还支持flask、异步代码的性能分析,具体可以查看官方文档进行学习。
Pyinstrument也提供了丰富的api供我们使用,官网文档有详细的介绍:https://pyinstrument.readthedocs.io/en/latest/reference.html
三、Pyinstrument与cProfile(python自带性能分析器)的不同
根据官方文档的描述来看,Pyinstrument的系统开销会比cProfile 这类跟踪分析器小很多,cProfile由于大量调用探查器,可能会扭曲测试结果:
来源:https://blog.csdn.net/momoda118/article/details/122805206


猜你喜欢
- win8下python安装和环境配置,具体内容如下python语法较C语言简单,容易上手。具体步骤 1.本文采用的是win8.1 64位系统
- 在国内,大部分人都是过农历生日,然后借助日历工具获取农历日期对应的阳历日期,以这一天来过生!这里还有一个痛点,即:每一年的农历生日对应的阳历
- 1.在pycharm下安装scrapy函数库2.将安装好scrapy函数库下的路径配置到系统path的环境变量中3.打开cmd终端输入:sc
- 本教程为大家分享了oracle 11g r2安装教程,供大家参考,具体内容如下一、环境脚本简单配置#!/bin/bashmv /etc/yu
- python有专门的神经网络库,但为了加深印象,我自己在numpy库的基础上,自己编写了一个简单的神经网络程序,是基于Rosenblatt感
- QMainWindow基本介绍QMainWindow主窗口为用户提供了一个应用程序框架,它有自己的布局,可以在布局中添加控件。窗口类型介绍P
- 了解了HTTP协议和HTML文档,我们其实就明白了一个Web应用的本质就是: 浏览器发送一个HTTP请求
- 1、Python函数函数是Python为了代码最大程度的重用和最小化代码冗余而提供的基本程序结构,用于将相关功能打包并参数化Python中可
- 合并对象的方法1. 使用展开运算符展开运算符(spread operator)提供了一种简洁的语法来合并对象。它使用{...}包裹需要合并的
- 比较简单的一个页面,类似csdn论坛在ns下的左边列表 描述: 1. 数据名:tree.mdb 表名:tree 表结构:id(自编)&nbs
- 导语:举例:Python做一个根据后缀名整理文件的工具,先来看看效果:自动整理前:自动整理后:这样看起来就好很多了。1.准备开始之前,你要确
- 假如你正在运行使用MySQL的Web应用程序,那么你把密码或者其他敏感信息保存在应用程序里的机会就很大。保护这些数据免受黑客或者窥探者的获取
- python应用文件读取与登录注册功能,具体实现代码如下所示:#!/usr/bin/python3# -*- coding: utf-8 -
- 今天是五一劳动节,可是我们劳动人民的节日哦。很多大网站都设计了特殊的logo来表示向每一位普通的劳动者致敬!下面就让我们看看这些logo吧!
- 本文实例为大家分享了python监控nginx端口和进程状态的具体代码,供大家参考,具体内容如下#!/usr/local/bin/pytho
- 在 Python 中也可以像 gcc/gdb 那样调试程序,只要在运行 Python 程序时引入 pdb 模块(假设要调试的程序名为 d.p
- 数据库: 30万条,有ID列但无主键,在要搜索的“分类”字段上建有非聚集索引 过程T-SQL: /* 用户自定义函数:执行时间在1150-1
- 获取一组radio被选中项的值var item = $(’input[@name=items][@checke
- 本文实例讲述了Python使用win32com实现的模拟浏览器功能。分享给大家供大家参考,具体如下:# -*- coding:UTF-8 -
- 在Python的网络编程中,getservbyport()函数和getservbyname()函数是socket模块中的两个函数,因此在使用