Python:用pyinstrument做性能分析
导引
在计算密集型计算或一些Web应用中,我们常常需要对代码做性能分析。在Python中,最原始的方法即是使用time
包中的time
函数(该函数以秒为计时单位):
from time import sleep, time
def func1():
sleep(0.001)
def func2():
sleep(2)
begin1 = time()
func1()
end1 = time()
begin2 = time()
func2()
end2 = time()
print("func1 consume: %f, func2 consume:%f, func3 consume: %f"\
% (end1-begin1, end2-begin2, end2-begin1))
控制台输出如下:
func1 consume: 0.001271, func2 consume:2.000421, func3 consume: 2.001692
pyinstrument基本用法
但是一旦函数多了起来,这种方式显然过于繁杂。类似C语言中的cProfile,在Python中,也有专门的性能分析工具pyinstrument
(该库非内置,需要使用conda/pip安装),我们在复杂的项目中可以使用它来代替简陋的time.time()
。
首先来看一下基本的使用,它的使用框架如下:
from pyinstrument import Profiler
from time import sleep
def func1():
sleep(0.1)
def func2():
sleep(2)
profiler = Profiler()
profiler.start()
# 这里是你要分析的代码,我们这里分析func1和func2两个函数
func1()
func2()
profiler.stop()
profiler.print()
可以看到,该工具也将其成功分析出了个函数的运行时间,并为我们标红指出了运行2s的func2函数是性能瓶颈:
如果我们进一步调低函数的运行时间:
def func3():
sleep(0.0001)
profiler = Profiler()
profiler.start()
func3()
profiler.stop()
profiler.print()
此时会显示“No samples were recorded”,如下:
这是因为你的代码运行时间小于了1ms,如果你仍然想分析这段代码,你可以选择将间隔值调到比默认的0.001(1ms)小,比如这样:
profiler = Profiler(interval=0.0001)
此时你会发现,func3也能被检测出来了:
此外,如果你要在浏览器中查看分析结果,可以使用profiler.open_in_browser()
代替profiler.print()
的控制台打印输出:
也可以使用profiler.output_html()
将profile以html形式输出。
分析Flask中的web响应性能
我们也可以对Flask应用进行性能分析,具体的用法如下:
from flask import Flask, g, make_response, request
app = Flask(__name__)
@app.before_request
def before_request():
if "profile" in request.args:
g.profiler = Profiler()
g.profiler.start()
@app.after_request
def after_request(response):
if not hasattr(g, "profiler"):
return response
g.profiler.stop()
output_html = g.profiler.output_html()
return make_response(output_html)
这样程序会检测每个request中的?profile
参数,如果检测到则会开始分析。在运行了profiler的request结束后,它会生成一个html输出替代掉真实的response并返回。
参考
- [1] https://docs.python.org/3/library/time.html?highlight=time#time.time
- [2] https://pyinstrument.readthedocs.io/en/latest/guide.html
Python:用pyinstrument做性能分析的更多相关文章
- chrome使用Timeline做性能分析
使用Timeline做性能分析 Timeline面板记录和分析了web应用运行时的所有活动情况,这是研究和查找性能问题的最佳途径.###Timeline面板概览 Timeline面板主要有三个部分构成 ...
- Python 优化第一步: 性能分析实践 使用cporfile+gprof2dot可视化
拿来主义: python -m cProfile -o profile.pstats to_profile.py gprof2dot -f pstats profile.pstats |dot -Tp ...
- python面试总结3(性能分析优化,GIl常考题)
python性能分析和优化,GIL常考题 什么是Cpython GIL Cpython解释器的内存管理并不是线程安全的 保护多线程情况下对python对象访问 Cpython使用简单的锁机制避免多个线 ...
- python 数据较大 性能分析
前提:若有一个几百M的文件需要解析,某个函数需要运行很多次(几千次),需要考虑性能问题 性能分析模块:cProfile 使用方法:cProfile.run("func()"),其中 ...
- golang 使用pprof和go-torch做性能分析
软件开发过程中,项目上线并不是终点.上线后,还要对程序的取样分析运行情况,并重构现有的功能,让程序执行更高效更稳写. golang的工具包内自带pprof功能,使找出程序中占内存和CPU较多的部分功能 ...
- 使用xdebug对php做性能分析调优
作为PHP程序员我们或多或少都了解或使用过xdebug.此文章记录安装和配置xdebug,以及如何使用它来分析php程序. 我的机器环境: mac, php 安装 xdebug 推荐使用 pecl 安 ...
- python pstats ,profile 性能分析
#! /usr/bin/env python # encoding=utf8 import pstats import profile def func1(): for i in range(1000 ...
- 使用JProfiler做性能分析过程
供自己记录一下,也分享给大家使用JProfiler的过程(感谢教我使用这个工具的大佬),整个博客比较粗糙,希望对大家有帮助 1.首先安装好JProfiler,打开eclipse,右键你所要分析的项目, ...
- 用cProfile做性能分析【转】
原文地址: https://www.cnblogs.com/kaituorensheng/p/4453953.html
随机推荐
- Java读写文件常用方法
一.字符流:读写纯文本(txt,csv等), 1 字符流写文件主要用:FileWriter,BufferedWriter,PrintWriter 1.1 测试 FileWriter 写入 privat ...
- An incompatible version 1.1.1 of the APR based Apache Tomcat Native library is installed, while Tomcat requires version 1.1.17
[问题现象]: 启动Tomcat时报如下类似错误信息: An incompatible version 1.1.12 of the APR based Apache Tomcat Native lib ...
- ASP.NET与.NET Framework和C#的关系
你好,是我琉忆. 今天我们讲一讲ASP.NET与.NET Framework和C#的关系. 在开始介绍ASP.NET之前,我们需要先了解以下运行ASP.NET的开发平台.NET框架.如果你之前学过C# ...
- SonarQube之采购选型参考
SonarQube是DevOps实践中主流的一款质量内建工具,过插件机制,Sonar 可以集成不同的测试工具,代码分析工具,以及持续集成工具,比如pmd-cpd.checkstyle.findbugs ...
- Spring中publish如何将多个Event和多个Listener进行无误差匹配
从命令模式的维度理解Spring 之Application Event - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中通自定义简单的Event和Listener阐述了Spring中pu ...
- Hyperledger Fabric 2.x Java区块链应用
一.说明 在上一篇文章中 <Hyperledger Fabric 2.x 自定义智能合约> 分享了智能合约的安装并使用 cli 客户端进行合约的调用:本文将使用 Java 代码基于 fab ...
- JavaScript ==原理与分析
JavaScript原始类型 ECMAScript 有 5 种原始类型(primitive type),即 Undefined.Null.Boolean.Number 和 String. typeof ...
- NSSCTF-easyupload2.0
相对于easyupload3.0,这个easyupload2.0就简单的很多,也可以使用和3.0一样的做法,但是应该还是有别的做法,就比如可以使用phtml这个后缀绕过检测 使用BP抓包修改一下 放包 ...
- Mac欺骗实验
实验目的 1.掌握MAC欺骗的原理 2.学会利用MacMakeUp软件工具进行伪造源MAC地址的MAC欺骗. 实验内容 使用MacMakeUp伪造主机mac地址,进行mac欺骗实验. 实验环境描述 1 ...
- Tableau“出走中国”,“卖”给阿里,中国BI用户该何去何从?
11月,Tableau在发给客户的邮件中透露将停止中国的直销业务,加入阿里的合作体系.消息来的如此突然,Tableau的同仁.合作伙伴.客户.用户.爱好者,甚至友商,无一不感到震惊和担忧. 在我们数据 ...