导引

在计算密集型计算或一些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并返回。

参考

Python:用pyinstrument做性能分析的更多相关文章

  1. chrome使用Timeline做性能分析

    使用Timeline做性能分析 Timeline面板记录和分析了web应用运行时的所有活动情况,这是研究和查找性能问题的最佳途径.###Timeline面板概览 Timeline面板主要有三个部分构成 ...

  2. Python 优化第一步: 性能分析实践 使用cporfile+gprof2dot可视化

    拿来主义: python -m cProfile -o profile.pstats to_profile.py gprof2dot -f pstats profile.pstats |dot -Tp ...

  3. python面试总结3(性能分析优化,GIl常考题)

    python性能分析和优化,GIL常考题 什么是Cpython GIL Cpython解释器的内存管理并不是线程安全的 保护多线程情况下对python对象访问 Cpython使用简单的锁机制避免多个线 ...

  4. python 数据较大 性能分析

    前提:若有一个几百M的文件需要解析,某个函数需要运行很多次(几千次),需要考虑性能问题 性能分析模块:cProfile 使用方法:cProfile.run("func()"),其中 ...

  5. golang 使用pprof和go-torch做性能分析

    软件开发过程中,项目上线并不是终点.上线后,还要对程序的取样分析运行情况,并重构现有的功能,让程序执行更高效更稳写. golang的工具包内自带pprof功能,使找出程序中占内存和CPU较多的部分功能 ...

  6. 使用xdebug对php做性能分析调优

    作为PHP程序员我们或多或少都了解或使用过xdebug.此文章记录安装和配置xdebug,以及如何使用它来分析php程序. 我的机器环境: mac, php 安装 xdebug 推荐使用 pecl 安 ...

  7. python pstats ,profile 性能分析

    #! /usr/bin/env python # encoding=utf8 import pstats import profile def func1(): for i in range(1000 ...

  8. 使用JProfiler做性能分析过程

    供自己记录一下,也分享给大家使用JProfiler的过程(感谢教我使用这个工具的大佬),整个博客比较粗糙,希望对大家有帮助 1.首先安装好JProfiler,打开eclipse,右键你所要分析的项目, ...

  9. 用cProfile做性能分析【转】

    原文地址: https://www.cnblogs.com/kaituorensheng/p/4453953.html

随机推荐

  1. LaunchScreen&LaunchImage

    优先级:LaunchScreen > LaunchImage 在xcode配置了,不起作用 1.清空xcode缓存 2.直接删掉程序 重新运行 如果是通过LaunchImage设置启动界面,那么 ...

  2. 区段统计 mysql 语句 case when then end as

    EXPLAIN SELECT COUNT(*),CASEWHEN device_width > 729 THEN '>729'WHEN device_width BETWEEN '720' ...

  3. 用JavaScript+HTML实现双色球随机摇号效果

    用JavaScript+HTML实现双色球随机摇号效果 首先要知道双色球的规则是什么 双色球投注区分为红球号码区和蓝球号码区 红球号码范围为01-33,蓝球号码范围为01-16 双色球每期从33个红球 ...

  4. 实现反向代理客户端IP透传

    默认情况下,使用反向代理时,后端服务器只能看到访问是从反向代理服务器的IP,无法真正识别到客户端IP.通过配置IP透传实现后端服务器识别到客户端真实IP. 一.Apache后端服务器部署 1.1 安装 ...

  5. python小白记录一 ——python脚本生成windows可执行exe

    1.需要安装pywin32 先查看自己有没有安装:使用如下命令查看 pip show pywin32 如果没有则用下面方式进行安装: pip install pywin32 然后等待安装完成: 2.再 ...

  6. 私有化轻量级持续集成部署方案--03-部署web服务(上)

    提示:本系列笔记全部存在于 Github, 可以直接在 Github 查看全部笔记 这一篇主要讲述部署一个 Web 项目,项目是我曾经搞的一个 VUE 模板项目:https://github.com/ ...

  7. Netty核心原理

    Netty核心原理 1. Netty介绍 1.1 原生NIO存在的问题 NIO的类库和API使用繁杂 需要具备其他额外的技能,如java多线程编程等才能编写出高质量的NIO程序 开发工作量和难度都非常 ...

  8. logstash获取nginx日志的配置

    nginx部分配置直接用json,省去很多麻烦 log_format json '{"@timestamp":"$time_iso8601",' '" ...

  9. Python "爬虫"出发前的装备之一正则表达式

    1. 正则表达式 正则表达式是一种模板表达式语言 通过定义规则去匹配.查找.替换.分割一个长字符串中特定的子字符信息. 如在一篇文章中查找出所有合法的电子邮箱地址,则可以先用正则表达式定义一个电子邮箱 ...

  10. ClickHouse在大数据领域应用实践

    一.序言 面向大数据量查询数据库,优点是在较大数据量(千万级)的前提下具有较好的查询性能. 1.应用场景 ClickHouse应用于OLAP(在线分析处理)领域,具体来说满足如下特点使用此技术比较合适 ...